카테고리 없음

[백준/파이썬][Gold V] 숨바꼭질 3 - 13549

난쟁이 개발자 2024. 11. 14. 20:01
반응형

[Gold V] 숨바꼭질 3 - 13549

문제 링크

성능 요약

메모리: 35296 KB, 시간: 140 ms

분류

0-1 너비 우선 탐색, 너비 우선 탐색, 데이크스트라, 그래프 이론, 그래프 탐색, 최단 경로

제출 일자

2023년 11월 23일 20:21:20

문제 설명

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

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

입력

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

출력

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

풀이

 

더보기
from collections import deque

def bfs(s, e) :
    # 1. q 생성, v[] 생성
    q = deque()
    v = [-1] * 100001

    # 2. 초기 데이터 삽입, v[] 초기화
    q.append(s)
    v[s] = 0

    while q :
        c = q.popleft()
        if c == e :
            return v[e]

        if 0 < c * 2 < 100001 and v[c * 2] == -1 :
            v[c * 2] = v[c]
            q.append(c * 2)

        if 0 <= c - 1 < 100001 and v[c - 1] == -1 :
            v[c - 1] = v[c] + 1
            q.append(c - 1)

        if 0 <= c + 1 < 100001 and v[c + 1] == -1 :
            v[c + 1] = v[c] + 1
            q.append(c + 1)


n, k = map(int, input().split())
res = bfs(n, k)
print(res)

순간이동은 0초간 발생하므로 +1을 하지 않았다. 이후 +1, -1 이동에 대해서는 +1초를 하였다.

특이한 점은 순간이동 if문을 가장 아래로 옮겼을 때, 오답으로 처리되었다는 점이다. 이 부분에 대해서 궁금해서 Claude 에 물었더니, 순간이동을 가장 위에 해야 최소값을 구할 수 있기 때문에 저렇게 하란다...

이 부분에 대해서는 추후 스터디를 통하여 알아보도록 할 것이다.

반응형