Gold 4
O
경로를 찾는 방법을 DFS로 접근해서 시간이 오래 걸림
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
둘째 줄에 어떻게 이동해야 하는지 공백으로 구분해 출력한다.
5 17
4
5 10 9 18 17
경로를 찾기 위해서 DFS를 이용하려고 했으나 이 역시도 쉽지 않았다.
BFS안에서 경로를 찾도록 해보자.
n,k=map(int,input().split())
visited = [0 for _ in range(100001)]
path = [0 for _ in range(100001)]
import sys
sys.setrecursionlimit(100000)
from collections import deque
def BFS():
q=deque()
q.append(n)
while q:
su=q.popleft()
move = [su-1,su+1,su*2]
if su == k:
return
for mv in move:
if mv>100000 or mv<0:
continue
if visited[mv]>0:
continue
q.append(mv)
visited[mv]=visited[su]+1
path[mv]=su
BFS()
print(visited[k])
a=k
b=[]
b.append(k)
for _ in range(visited[k]):
b.append(path[a])
a=path[a]
print(' '.join(map(str,b[::-1])))
path라는 다른 리스트를 하나 더 만드는 방법이다.
큐에 append 할 때 이동하려는 path에 현재 위치를 기록해 놓는다.
마지막에는 기록된 path를 링크드 리스트처럼 인덱스로 타고 점차 가서 역순으로 출력한다.
x
이 역시도 조금만 더 생각하면 해결할 수 있는 문제였던 것 같다.
그래프를 다룰 때 숨바꼭질 1,2,3,4에서 했던 내용들을 생각하며 조금 더 편하게 접근하자.
덕분에 좋은 정보 얻어갑니다, 감사합니다.