본문 바로가기
코딩 테스트 수련의방

백준 #1697

by L3m0n S0ju 2022. 3. 28.

숨바꼭질 성공다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 145262 41197 25798 24.998%

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

 

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

예제 입력 1 복사

5 17

예제 출력 1 복사

4

힌트

수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.

출처

Olympiad > USA Computing Olympiad > 2006-2007 Season > USACO US Open 2007 Contest > Silver 2번

 

 

 

 

 


import sys
from collections import deque


def bfs():
    q = deque()
    q.append(N)
    while q:
        x = q.popleft()
        if x == K:
            print(dist[x])
            break
        for nx in (x-1, x+1, x*2):
            if 0 <= nx <= MAX and not dist[nx]:
                dist[nx] = dist[x] + 1
                q.append(nx)


if __name__ == '__main__':

    MAX = 100000
    dist = [0] * (MAX+1)
    N, K = list(map(int, sys.stdin.readline().split()))

    bfs()

 

bfs를 이용해서 가장 먼저 K가 발견될 때의 거리를 출력하면 된다. dist = [0] * (MAX+1)에서 +1을 안붙이면 dist[MAX]에서 런타임 에러가 발생하니 주의하자.

'코딩 테스트 수련의방' 카테고리의 다른 글

백준 #4963  (0) 2022.03.30
백준 #11724  (0) 2022.03.30
백준 #1149  (0) 2022.03.28
백준 #11866  (0) 2022.03.28
백준 #1966  (0) 2022.03.28

댓글