본문 바로가기
Coding Test/Problems

[BOJ | Python] 1697번: 숨바꼭질

by haerr 2025. 5. 11.

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