BOJ
[BOJ] 1697. 숨바꼭질
rubato.dev
2025. 7. 22. 20:26
📌 문제 제목
문제 링크: BOJ 1697
🗒️ 문제 설명
수빈이는 현재 점 N (0 <= N <= 100,000)에 있고, 동생은 점 K (0 <= K <= 100,000)에 있다.
수빈이는 걷거나 순간이동 할 수 있다.
수빈이의 위치가 X일 때, 1초 후에 X-1 or X+1 or 2*X로 이동할 수 있다.
💡 문제 해결 아이디어
- 수빈이의 좌표 N을 큐에 넣는다.
- for 문에 걷기와 순간이동한 결과를 넣는다.
- 큐에 popleft를 할 때 K와 같으면 dist[K]를 출력한다.
⌛️ 시간 복잡도
- O(N)
✅ 최종 코드
import sys
from collections import deque
input = sys.stdin.readline
N, K = map(int, input().split())
queue = deque([N])
dist = [-1] * 100_001
dist[N] = 0
while queue:
nx = queue.popleft()
if nx == K:
print(dist[nx])
exit(0)
for res in [2*nx, nx-1, nx+1]:
if not (0 <= res < 100_001):
continue
if dist[res] == -1:
queue.append(res)
dist[res] = dist[nx] + 1