백준 1697번 파이썬 풀이

홍태리·2022년 2월 19일
0

백준

목록 보기
7/9
post-thumbnail

첫 시도, 잘못된 코드

#백준 1697번

from collections import deque

current, target = map(int, input().split())

if current >= target:
    print(current - target)
else:
    queue = deque([(current, 0)])
    while queue:
        current, moving_time = queue.popleft()
        if current == target:
            print(moving_time)
            break
        elif current > target:
            queue.append((current-1, moving_time+1))
        else:
            if 0 <= current*2 <= 100000:
                queue.append((current*2, moving_time+1))
            if 0 <= current+1 <= 100000:
                queue.append((current+1, moving_time+1))
            if 0 <= current-1 <= 100000:
                queue.append((current-1, moving_time+1))

메모리초과


수정된 코드

#백준 1697번

from collections import deque

#시작위치, 끝위치 받아오기
current, target = map(int, input().split())

if current >= target:
    print(current - target)
else:
    #큐에 보관할 정보 : 현재 위치, 걸린 시간
    queue = deque([(current, 0)])
    #중복된 숫자가 다시 큐에 추가되는 것을 방지하기 위한 세트
    visited_num_set = set([current])
    while queue:
        #큐에서 노드 추출
        current, time_cost = queue.popleft()
        #목적지에 도착했다면 걸린 시간 출력하고 반복문 탈출
        if current == target:
            print(time_cost)
            break
        #현재 위치가 목적지보다 클 경우 : -1 이동
        elif current > target:
            #-1 이동한 위치가 다른 경로에서 이미 도달한 위치가 아닌 경우에만 새로 추가
            if current-1 not in visited_num_set:
                queue.append((current-1, time_cost+1))
                visited_num_set.add(current-1)
        # 현재 위치가 목적지보다 작을 경우 : *2, +1, -1 이동
        else:
            #*2 이동한 위치가 범위 안이고 다른 경로에서 이미 도달한 위치가 아닌 경우에만 새로 추가
            if 0 <= current*2 <= 100000 and current*2 not in visited_num_set:
                queue.append((current*2, time_cost+1))
                visited_num_set.add(current*2)
            #+1 이동한 위치가 범위 안이고 다른 경로에서 이미 도달한 위치가 아닌 경우에만 새로 추가
            if 0 <= current+1 <= 100000 and current+1 not in visited_num_set:
                queue.append((current+1, time_cost+1))
                visited_num_set.add(current+1)
            #-1 이동한 위치가 범위 안이고 다른 경로에서 이미 도달한 위치가 아닌 경우에만 새로 추가
            if 0 <= current-1 <= 100000 and current-1 not in visited_num_set:
                queue.append((current-1, time_cost+1))
                visited_num_set.add(current-1)

맞았습니다

profile
스타트업을 준비하는 대학생입니다.

0개의 댓글