https://www.acmicpc.net/problem/1697

문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
BFS를 사용. parent를 현재위치 X라고 하면, child는 그 다음에 이동할 수 있는 위치인 X-1, X+1, 2*X이다.
from collections import deque
N, K = map(int, input().split())
MAX = 100001 # 범위는 0 ~ 100000
visited = [False] * MAX
def bfs():
queue = deque()
queue.append((N, 0))
visited[N] = True
while queue:
pos, time = queue.popleft()
if pos == K:
return time
for next_pos in (pos - 1, pos + 1, pos * 2):
if 0 <= next_pos < MAX and not visited[next_pos]:
visited[next_pos] = True
queue.append((next_pos, time + 1))
print(bfs())
1. 시작점 N에서부터 BFS를 시작한다.
2. 매 초마다 갈 수 있는 3개의 위치를 탐색한다. (X-1, X+1, 2*X)
3. 중복 방문 방지를 위해 visited 리스트를 사용한다.
4. 처음으로 K에 도착하면 그때의 시간을 출력한다.
'Coding Test > Problems' 카테고리의 다른 글
| [BOJ | Python] 17396번: 백도어 (4) | 2025.05.12 |
|---|---|
| [BOJ | Python] 16953번: A → B (0) | 2025.05.11 |
| [BOJ | Python] Router (0) | 2025.05.06 |
| [BOJ | Python] 29278번: 스택 2 (0) | 2025.05.04 |
| [BOJ | Python] 10816번: 숫자 카드 2 (0) | 2025.04.07 |