열렬히.뛰기

1697번: 숨바꼭질

알고리즘: 실전 > 백준 단계별로 풀기: 10번 ~ 25번 > 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를 이용

  1. 배열 visited에 0을 채워 넣음.
  2. 큐에서 숫자 v를 빼고, v == 목표숫자 인지 확인
  3. 만약 v가 목표 숫자와 같다면, visited[v]를 반환
  4. 그렇지 않다면, [v-1, v+1, 2*v]라는 배열을 만듬
    • 이후 해당 배열로 for문을 돌림. (변수 i)

    • 만약 i가 0과 100000 사이이고, visited[i]에서 0이면

      visited[i] = visited[v] + 1로 만들어줌.

코드

python
## 숨바꼭질
import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())
visited = [0] * 1000001

def find(start):
    queue = deque([start])

    while queue:
        v = queue.popleft()
        if v == k:
            return visited[v]
        for i in (v-1, v+1, 2*v):
            if 0 <= i <= 1000000 and not visited[i]:
                visited[i] = visited[v] + 1
                queue.append(i)

print(find(n))