본문 바로가기
WIL&TIL/TIL

20230425 TIL - dotenv오류, 알고리즘

by 코드뭉치 2023. 4. 25.

 

dotenv설치 오류

 

 

알고리즘

 

 

인덱스 바꾸기

더보기

1. 슬라이싱

def solution(my_string, num1, num2):
    a = my_string[num1]
    b = my_string[num2]
    c = num1
    d = num2
    new_string = my_string[:c] + b + my_string[c+1:d] + a + my_string[d+1:]
    
    return new_string

 

2. for문

def solution(my_string, num1, num2):
    answer = ''
    for idx in range(len(my_string)):
        if idx==num1: idx = num2
        elif idx==num2: idx = num1
        answer += my_string[idx]
    return answer

 

3. 스왑

  두 값을 서로 바꿔줄 수 있다.

def solution(my_string, num1, num2):
    answer = list(my_string)
    answer[num1], answer[num2] = answer[num2], answer[num1]
    return ''.join(answer)

 

 

 

숫자 짝꿍

더보기

문제의 정수 길이가 300만개까지라서 시간복잡도가 N^2이면 실패하는 문제였다.

2중 for문없이 해결해야 한다.

 

1. collections의 Counter

from collections import Counter
def solution(X, Y):
    intersection = list((Counter(X) & Counter(Y)).elements())
    intersection.sort(reverse=True)

    a = "".join(sorted(intersection, reverse=True))
    if set(a) == {"0"}:
        return "0"
    elif a == "":
        return "-1"
    else:
        return a

 

2. set()과 .intersection()

def solution(X, Y):
    repeat_num = []
    if len(set(X).intersection(set(Y))) == 0:
        return "-1"
    elif set(X).intersection(set(Y)) == {"0"}:
        return "0"
    else:
        for i in Y:
            if X.find(i) != -1:
                repeat_num.append(i)
        return str("".join(sorted(repeat_num, reverse=True)))

 

3. 각각에 for문을 사용해서 arr_x, arr_y라는 각 숫자의 개수를 담은 배열 생성

def solution(X, Y):
    answer = ''
    arr_x = [0]*10
    arr_y = [0]*10
    for i in X: 
        arr_x[int(i)]+=1
    for i in Y: 
        arr_y[int(i)]+=1
    for i in range(0,10):
        answer = str(i)*(min(arr_x[i],arr_y[i])) + answer
    if answer == '': answer = '-1'
    elif answer.replace('0','') == '': answer = '0'
    return answer

 

 

 

캐릭터의 좌표

더보기

1. min, max를 사용해서 보드밖으로 못나가게 하는 방법

def solution(keyinput, board):
    x, y = 0, 0
    for direction in keyinput:
        if direction == "right":
            x = min(x + 1, board[0]//2)
        elif direction == "left":
            x = max(x - 1, -board[0]//2 + 1)
        elif direction == "up":
            y = min(y + 1, board[1]//2)
        elif direction == "down":
            y = max(y - 1, -board[1]//2 + 1)
    return [x, y]

 

2. 딕셔너리 사용

def solution(keyinput, board):
    board_width = board[0]//2
    board_hight = board[1]//2

    keyinput_dic = {"up":[0,1], "down":[0,-1], "left":[-1,0], "right":[1,0]}
    answer = [0,0]
    for i in keyinput:
        if board_width >= answer[0]+keyinput_dic[i][0] >= -board_width :
            answer[0] += keyinput_dic[i][0]
        if board_hight >= answer[1]+keyinput_dic[i][1] >= -board_hight :
            answer[1] += keyinput_dic[i][1]
    return answer

 

3. 보드의 길이를 map,lambda를 사용한 리스트로 표현

def solution(keyinput, board):
    answer = [0, 0]
    board_m = list(map(lambda x: (x-1)/2, board))
    x_= keyinput.count("right")-keyinput.count("left")
    y_ = keyinput.count("up")-keyinput.count("down")
    if abs(x_) < board_m[0]:
        answer[0] = x_
    elif x_ < 0:
        answer[0] = -board_m[0]
    else:
        answer[0] = board_m[0]
    if abs(y_) < board_m[1]:
        answer[1] = y_
    elif y_ < 0:
        answer[1] = -board_m[1]
    else:
        answer[1] = board_m[1]
    return answer

 

 

배열 만들기2

더보기

0. 5의 배수만 탐색하는 방법(오류 있음 => ex. l이 56일때 계산값에 55가 포함되어 오류 발생)

    이후 set의 {"0","5" }또는 {"5"}의 부분집합만 정답에 추가

def solution(l, r):
    result = []
    num1 = l//5*5
    num2 = r//5*5 + 5
    for i in range(num1, num2, 5):
        if set(str(i)) == set({"0", "5"}) or set(str(i)) == set({'5'}):
            result.append(i)
    return result if result else [-1]

 

1.  replace로 0과 5를 다 지웠을 때, 빈 문자열이면 정답에 추가해주는 방법

def solution(l, r):
    answer = []
    for i in range(l,r+1):
        if str(i).replace('5','').replace('0','')=='': answer.append(i)
    if answer == []: answer.append(-1)
    return answer

 

 

댓글