숨바꼭질(백준 13549번)
💡 **Check Point !
( 해당사항 ✓체크 )
막힘 없이 수월하게 풀린 문제인가?
1시간이내로 풀렸던 문제인가?
1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
시간을 써도 도무지 풀 수 없는 문제인가?
솔루션을 찾아봤는가? ✓
난이도 체감
최상
상✓
중
하
이해도
완벽히 이해✓
다소 헷갈리는 부분들이 있음
이해 못함
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
나의 풀이(정답 참고)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from collections import deque
N,K=map(int,input().split())
def BFS(N,K,visited):
queue=deque()
queue.append(N)
visited[N]=0
while queue:
c=queue.popleft()
if c==K:
return visited[c]
if 0<=c-1<=100000 and visited[c-1]==-1:
queue.append(c-1)
visited[c-1]=visited[c]+1
if 0<=c*2<=100000 and visited[c*2]==-1:
queue.appendleft(c*2)
visited[c*2]=visited[c]
if 0<=c+1<=100000 and visited[c+1]==-1:
queue.append(c+1)
visited[c+1]=visited[c]+1
visited=[-1]*100001
print(BFS(N,K,visited))
- 이런 선택지가 많은 문제들이 나오면 BFS를 먼저 떠올려보는 것도 좋은 방법인 것 같다.
- 처음 내가 풀었던 방식으로 했을 때 메모리 초과가 나왔다.
- queue에 위치와 몇번 연산되었는지 정보를 튜플 형태로 저장했는데, 이것이 원인이었다.
- visited를 유지하여, visited에 총 연산 횟수를 적어놓는다면 메모리 초과 없이 해결할 수 있었다.
This post is licensed under CC BY 4.0 by the author.