새소식

Computer Science/코딩테스트 문제 풀이

[백준] [파이썬] [BFS] 13913번: 숨바꼭질 4

  • -

문제집 추천, 이 문제집에 나온 유형들만 공부해도 코딩테스트는 거뜬: https://www.acmicpc.net/workbook/by/BaaaaaaaaaaarkingDog

 

문제 보러 가기

 

13913번: 숨바꼭질 4

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

www.acmicpc.net

관련 다른 문제:

1697번: 숨바꼭질

12851번: 숨바꼭질2

13549번: 숨바꼭질3

13913번: 숨바꼭질4

17071번: 숨바꼭질5

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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

5 17

4
5 4 8 16 17


이 문제는 같은 입력이여도 다른 출력이 나온다는 특징이 있다. 기존 13549번: 숨바꼭질 3와 똑같은 문제이지만 수빈이가 동생을 찾는 최단 시간의 루트를 기록해서 출력해야하는 점이 추가되었다.

아쉽게도 그 부분에서 메모리 초과를 해결하지 못하였었다.


테스트 케이스는 맞지만 메모리 초과가 난 코드

import sys from collections import deque if __name__=="__main__": N,K=map(int, input().split()) MAX=100000 dis=[0]*(MAX+1) root=[[] for _ in range(MAX+1)] Q=deque() Q.append(N) root[N].append(N) while Q: loc=Q.popleft() if loc==K: break for new_loc in (loc-1,loc+1,loc*2): if 0<=new_loc<MAX and dis[new_loc]==0: dis[new_loc]=dis[loc]+1 Q.append(new_loc) root[new_loc].append(new_loc) root[new_loc]+=root[loc] print(dis[K]) print(*root[K][::-1])

각 위치에 이 위치까지 오는데 어떤 위치를 거치고 왔는지를 넣어주었는데 최종적으로 메모리 초과가 발생하였다.


정답

from collections import deque import sys MAX=100_000+1 def solution(N,K): locations=[0]*MAX root=[0]*MAX # 최단시간에 만나는 루트를 기록하기 위해 Q=deque() Q.append(N) while Q: x=Q.popleft() if x==K: break for nx in [x-1, x+1, 2*x]: if 0<=nx<MAX and locations[nx]==0: locations[nx] = locations[x] + 1 root[nx] = x Q.append(nx) ans = [] recode = K # 최종 위치에서 이전 위치로 이동하며 ans에 넣음 for _ in range(locations[K]+1): ans.append(recode) recode = root[recode] return locations[K], ans[::-1] if __name__=="__main__": N,K=map(int, input().split()) ans1,ans2 = solution(N,K) print(ans1) print(*ans2)

현재 위치는 바로 직전 위치 정보하나씩만 넣어줘도 타고 타고 가면서 출력할수 있었다!!
마지막 for문 부분을 기억하자

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.