본문 바로가기
코딩 테스트/프로그래머스

숫자 변환하기

by ornni 2024. 9. 9.
728x90
반응형

첫번째 코드

 

BFS를 이용해야겠다! 라고 생각을 했다.

처음에는 값만을 넣었는데, count가 정답을 구하기 위해 별도로 필요하므로 [값, count] 형태로 현재까지의 계산값과 계산 횟수를 표시한다.

 

계산할 수 있는 모든 값을 계산하고, y와 같은 경우 answer 리스트에 넣는다.

계산 횟수를 기준으로 정렬 한 후 계산 횟수가 가장 적은 경우만 불러온다.

 

from collections import deque

def solution(x, y, n):
    answer = []
    count = 0
    queue = deque()
    queue.append([x, count])

    while queue:
        now = queue.popleft()
        count = now[1] + 1
        if now[0] == y:
            answer.append(now)
        else:
            if now[0] < y:
                queue.append([now[0]*3, count])
                queue.append([now[0]*2, count])
                queue.append([now[0]+n, count])

    answer.sort(key = lambda x: x[1])

    if not answer:
        return -1
    else:
        return answer[0][1]
    

테스트 케이스는 통과하지만, 불필요한 연산이 많아 시간초과가 발생한다.


두번째 코드

 

정답에 해당하는 리스트를 만들어서 sort 하는 방법은 추가로 계산이 들어가므로, 해당 부분을 제거한다.

 

from collections import deque

def solution(x, y, n):
    answer = []
    count = 0
    queue = deque()
    queue.append([x, count])

    while queue:
        now = queue.popleft()
        count = now[1] + 1
        if now[0] == y:
            answer = now
            break
        else:
            if now[0] < y:
                queue.append([now[0]*3, count])
                queue.append([now[0]*2, count])
                queue.append([now[0]+n, count])

    if not answer:
        return -1
    else:
        return answer[1]
   

테스트 케이스는 통과하지만, 부분부분 시간초과가 발생한다!


 

세번째 코드

 

x에서 y로 가는 계산을 하는 경우 무한으로 커질 수 있으므로, 반대로 y에서 x를 구하는 방법을 통해 계산량을 줄인다!

 

from collections import deque

def solution(x, y, n):
    answer = []
    count = 0
    queue = deque()
    queue.append([y, count])

    while queue:
        now = queue.popleft()
        count = now[1] + 1
        if now[0] == x:
            answer = now
            break
        else:
            if now[0] > x:
                if now[0] % 3 == 0:
                    queue.append([now[0]//3, count])
                if now[0] % 2 == 0:
                    queue.append([now[0]//2, count])
                queue.append([now[0]-n, count])

    if not answer:
        return -1
    else:
        return answer[1]
    

통과!


링크

https://github.com/ornni/programmers/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/154538.%E2%80%85%EC%88%AB%EC%9E%90%E2%80%85%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0

 

programmers/프로그래머스/2/154538. 숫자 변환하기 at main · ornni/programmers

repository for recording Programmers Algorithm problem solving - ornni/programmers

github.com

 

반응형

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

물 부족  (0) 2024.10.11
연속된 부분 수열의 합  (0) 2024.09.13
배열 만들기 2  (0) 2024.09.06
[1차] 비밀지도  (0) 2024.09.02
예산  (0) 2024.08.30