[백준/파이썬] 1697번 숨바꼭질 풀이

업데이트:



문제 정보


풀이

문제

수빈이의 현재 위치 N에서 동생의 위치 K로 이동할 때, 가능한 이동은 -1, +1, *2 세 가지입니다.

한 번 이동할 때마다 시간이 1초 걸릴 때, 동생을 찾는 최소 시간을 구하면 됩니다.

코드

from collections import deque

Q = deque([])
enQ = Q.append
deQ = Q.popleft

n, k = map(int, input().split())
enQ((n, 0, set()))

while Q:
    pos = deQ()
    pos[2].add(pos[0])
    if pos[0] == k:
        print(pos[1])
        break
    if pos[0] > 0 and pos[0]-1 not in pos[2]:
        enQ((pos[0]-1, pos[1]+1, pos[2]))
    if pos[0] < 100000 and pos[0]+1 not in pos[2]:
        enQ((pos[0]+1, pos[1]+1, pos[2]))
    if pos[0] <= 50000 and pos[0]*2 not in pos[2]:
        enQ((pos[0]*2, pos[1]+1, pos[2]))

설명

가능한 이동을 동일 가중치(1초) 간선으로 보면 그래프 최단거리 문제입니다.

  • 큐(deque)를 이용한 BFS로 탐색합니다.
  • 상태는 (현재 위치, 누적 시간, 방문 집합)으로 관리합니다.
  • 목표 위치 K에 처음 도달한 시점의 시간이 최소 시간입니다.


댓글남기기