[백준] 13913 숨바꼭질 4 - BFS

jckim22·2023년 7월 18일
0

[ALGORITHM] STUDY (PS)

목록 보기
35/86

난이도

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안에서 경로를 찾도록 해보자.

풀이(python)

Python

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에서 했던 내용들을 생각하며 조금 더 편하게 접근하자.

profile
개발/보안

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기