[BOJ] 숨바꼭질 4 (no.13913)
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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())
Author And Source
이 문제에 관하여([BOJ] 숨바꼭질 4 (no.13913)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wisepine/BOJ-숨바꼭질-4-no.13913저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)