[프로그래머스] 숫자 변환하기

·2023년 12월 29일
0

알고리즘

목록 보기
12/23

문제

[프로그래머스] 숫자 변환하기

실패 코드 - 시간 초과

from collections import deque

def bfs(x,y,n):
    queue = deque()
    queue.append((x, 0))
    
    while queue:
        nx, cnt = queue.popleft()
        
        if nx == y:
            return cnt
        
        for i in range(3):
            ax = 연산(nx, n, i)
            if ax <= y:
                queue.append((ax, cnt+1))
    return -1

def 연산(x, n, i):
    if i == 0:
        return x+n
    elif i == 1:
        return x*2
    else:
        return x*3
            
        
def solution(x, y, n):
    return bfs(x,y,n)
  • 제출했을 때, 몇 가지 테스트 케이스에서 시간 초과가 발생했다.

정답 코드

from collections import deque

def bfs(x,y,n):
    queue = deque()
    dic = {}
    queue.append((x, 0))
    dic[x] = 0
    
    while queue:
        nx, cnt = queue.popleft()
        
        if nx == y:
            return cnt
        
        for i in range(3):
            ax = 연산(nx, n, i)
            if ax <= y and ax not in dic:
                queue.append((ax, cnt+1))
                dic[ax] = cnt+1
    return -1

def 연산(x, n, i):
    if i == 0:
        return x+n
    elif i == 1:
        return x*2
    else:
        return x*3
            
        
def solution(x, y, n):
    return bfs(x,y,n)
  • 기존 코드에서 3가지 연산한 값을 모두 queue에 넣어서 시간 초과가 발생한 것이었다.
  • 딕셔너리 코드를 추가했다.
  • queue와 동시에 딕셔너리에도 값을 넣어줬다. 다만, 이미 딕셔너리에 있는 값은 더 적은 횟수로 계산된 적이 있다는 의미이므로 queue에 append해주지 않았다.

0개의 댓글