수빈이가 동생을 찾는 가장 빠른 시간과 경로 구하기.
입력 | 출력 |
---|---|
5 17 | 4 5 10 9 18 17 |
5 17 | 4 5 4 8 16 17 |
: 경로를 어떻게 출력해야할 지?
해당 경로를 방문하기 바로 전 방문한 지점을 저장하는 배열이 필요
path[a] = b 이면 b지점에서 바로 a지점을 방문했다는 뜻.
x가 n이 될 때까지 path[x]를 ans 리스트에 담는다. 이후 ans 리스트를 reverse함수로 거꾸로 값을 정렬하고 값만 출력한다.
from collections import deque
def bfs(n, k, visited, path):
q = deque()
q.append(n)
while q:
x = q.popleft()
if x == k:
print(visited[x])
ans = []
while True:
ans.append(x)
if x == n:
break
x = path[x]
ans.reverse()
print(*ans)
return
for nx in (x-1, x+1, x*2):
if 0<=nx<=100000 and visited[nx]==0:
visited[nx] = visited[x] + 1
q.append(nx)
path[nx] = x
n, k = map(int, input().split())
visited = [0]*100001 # 방문여부 및 해당 거리까지 걸리는 시간
path = [0]*100001 # 해당 거리까지 오기 바로 전 지점 기록
bfs(n, k, visited, path)