[BOJ] 숨바꼭질 4 (no.13913)

숑숑·2021년 1월 22일
0

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

둘째 줄에 어떻게 이동해야 하는지 공백으로 구분해 출력한다.


🤔 생각

  • 숨바꼭질 1과 달리, 최단경로 자체를 출력해줘야 하는 문제다.

  • 뭐 그거야 큐잉할 때마다 부모 노드를 저장하면 될일이긴 한데...

  • 경로 자체를 저장해둘까 하다가, 그럼 리스트가 너무 뚱뚱해지니

  • 인덱스로 부모 노드를 구분하고, 후에 경로를 만들어주는 반복문을 따로 돌리는걸로.

📌 내 풀이

import sys
input = sys.stdin.readline

def main():

    def bfs(n,k):
        q = [n]
        cache = [False]*100001
        parent = [0]*100001
        cnt = 0
        route = [k]

        while q:
            tmp = []

            for x in q:
                if x == k: break

                for i in (x-1, x+1, x*2):
                    if 0 <= i < 100001 and not cache[i]: 
                        cache[i] = True
                        parent[i] = x
                        tmp.append(i)
            
            q = tmp

        while k != n:
            route.append(parent[k])
            k = parent[k]
        
        print(len(route)-1)
        print(*route[::-1])

    n,k = map(int, input().split())
    bfs(n,k)


if __name__ == "__main__":
    sys.exit(main())
profile
툴 만들기 좋아하는 삽질 전문(...) 주니어 백엔드 개발자입니다.

0개의 댓글