링크
https://www.acmicpc.net/problem/13549
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
5 17
2
수빈이가 5-10-9-18-17 순으로 가면 2초만에 동생을 찾을 수 있다.
n, k = map(int, input().split()) # 수빈이와 동생의 위치를 입력받음
pq = []
heapq.heappush(pq, (0, n)) # 우선순위 큐(pq)를 초기화 -> _item의 첫번째 원소는 우선순위(시간), 두 번째 원소는 시작 노드
visit = [False] * 100001 # 방문여부를 나타내는 visit 리스트를 false로 100001개를 초기화
while pq:
time, x = heapq.heappop(pq) # 현재 노드(x)까지 걸린 시간과 현재 노드를 큐에서 꺼냄
visit[x] = True # 현재 노드 방문 체크
if x == k: # 현재 노드가 목표값(k)라면 즉시 종료
print(time)
break
if x - 1 >= 0 and not visit[x - 1]: # x - 1로 이동하는 경우 이동시간(time)을 1 증가시키고 큐에 추가
heapq.heappush(pq, (time + 1, x - 1))
if x + 1 <= 100000 and not visit[x + 1]: # x + 1로 이동하는 경우 이동시간(time)을 1 증가시키고 큐에 추가
heapq.heappush(pq, (time + 1, x + 1))
if x * 2 <= 100000 and not visit[x * 2]: # 2 * x로 이동하는 경우 이동시간(time)을 증가시키지 않고 큐에 추가
heapq.heappush(pq, (time, x * 2))
import heapq
n, k = map(int, input().split()) # 수빈이와 동생의 위치를 입력받음
pq = []
heapq.heappush(pq, (0, n)) # 우선순위 큐(pq)를 초기화 -> _item의 첫번째 원소는 우선순위(시간), 두 번째 원소는 시작 노드
visit = [False] * 100001 # 방문여부를 나타내는 visit 리스트를 false로 100001개를 초기화
while pq:
time, x = heapq.heappop(pq) # 현재 노드(x)까지 걸린 시간과 현재 노드를 큐에서 꺼냄
visit[x] = True # 현재 노드 방문 체크
if x == k: # 현재 노드가 목표값(k)라면 즉시 종료
print(time)
break
if x - 1 >= 0 and not visit[x - 1]: # x - 1로 이동하는 경우 이동시간(time)을 1 증가시키고 큐에 추가
heapq.heappush(pq, (time + 1, x - 1))
if x + 1 <= 100000 and not visit[x + 1]: # x + 1로 이동하는 경우 이동시간(time)을 1 증가시키고 큐에 추가
heapq.heappush(pq, (time + 1, x + 1))
if x * 2 <= 100000 and not visit[x * 2]: # 2 * x로 이동하는 경우 이동시간(time)을 증가시키지 않고 큐에 추가
heapq.heappush(pq, (time, x * 2))