Algorithm (PS)

[백준] 13913번 : 숨바꼭질 4 (파이썬/Python) - BFS 풀이

minjiwoo 2022. 12. 10. 15:34
728x90

https://www.acmicpc.net/problem/13913

 

13913번: 숨바꼭질 4

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

숨바꼭질 1 번문제와 문제는 같은데, 업그레이드 된 부분은 수빈이가 동생을 찾을 수 있는 가장 빠른 시간에 대한 경로를 저장해두어야 한다는 것이다. 
경로 저장을 위해 note라는 배열을 생성한다. 

for nx in [now-1, now+1, now*2]:
    if 0 <= nx <= MAX and not visited[nx]:
        visited[nx] = visited[now] + 1
        queue.append(nx)
        note[nx] = now # 다음 이동 위치에 현재 위치 기록하기

그리고 새로 이동할 위치에 해당하는 nx좌표로 이동하기 이전에 now 라는 위치에 있었다는 의미로 note[nx] = now 저장을 해둔다. 

if now == k:
    print(visited[now])
    get_path(now)
    break

현재 위치가 k 에 도달했을 때 get_path 함수를 호출하여, k까지 최단거리로 이동해온 경로를 출력한다. 

def get_path(now):
    path = []
    temp = now
    for i in range(visited[now]+1): # 목표지점까지 탐색하는데 걸린 거리만큼 저장된 경로를 하나씩 note 리스트에서 꺼낸다.
        path.append(temp)
        temp = note[temp]

    print(*path[::-1])

 

 

from collections import deque 

n, k = map(int, input().split())
MAX = 100000
visited = [0] * (MAX + 1)
note = [0] * (MAX+1) # 경로 저장을 위한 배열

def bfs():
    queue = deque() # 현재 위치, 시간, 이동경로
    queue.append(n)
    while queue:
        now = queue.popleft()
        if now == k:
            print(visited[now])
            get_path(now)
            break

        for nx in [now-1, now+1, now*2]:
            if 0 <= nx <= MAX and not visited[nx]:
                visited[nx] = visited[now] + 1
                queue.append(nx)
                note[nx] = now # 다음 이동 위치에 현재 위치 기록하기

def get_path(now):
    path = []
    temp = now
    for i in range(visited[now]+1): # 목표지점까지 탐색하는데 걸린 거리만큼 저장된 경로를 하나씩 note 리스트에서 꺼낸다. 
        path.append(temp)
        temp = note[temp]

    print(*path[::-1])

bfs()

728x90