본문 바로가기

Algorithm/BOJ

[BOJ] 13549. 숨바꼭질 3 Python

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

 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

 

1. 해결방법

DFS인줄 알았으나, 재귀에러에 두들겨 맞고 BFS로 풀었다.

왜 bfs인지는 문제를 풀면서 느낌;;


1. 현재 인덱스 위치랑 time을 q에 append 한다. 
2. x * 2, x - 1, x + 1의 경우에는 가중치가 0 그리고 1로 다르므로 bfs를 이용하여 3가지 모두 탐색을 한다.
3. 유효성 검사와 방문체크도 하고, 새로운 인덱스 위치와 가중치인 time의 값을 갱신해서 q에 append한다.

주의할점) x * 2, x - 1, x + 1 순서로 for문을 탐색해야 정답이 나온다.
예를 들면, 4 6을 입력받았을 때, 4 -> 3 -> 6 의 방식으로 가중치가 1이 나오게 된다.

하지만, 여기서 x * 2, x + 1, x - 1로 한다면???
6에 도달한 가중치가 2가 되어버려서 유효성 검사때문에 최소 가중치의 값을 얻거나 갱신하지도 못하고 2로 고정되어버린다.

반례는 직접 디버깅을 하길 권장.

 

 

2. 정답코드

import sys
from collections import deque

input = sys.stdin.readline


N, K = map(int, input().split())
chk = [False] * 100001


def bfs():
    q = deque()
    q.append((N, 0))

    while q:
        idx, time = q.popleft()

        if idx == K:
            return time

        for n in (idx * 2, idx - 1, idx + 1):
            if 0 <= n <= 100000 and chk[n] == False:
                chk[n] = True
                if n == idx * 2:
                    q.append((n, time))
                else:
                    q.append((n, time + 1))

chk[N] = True
print(bfs())

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 2206. 벽 부수고 이동하기 Python  (0) 2023.02.02
[BOJ] 2146. 다리만들기 Python  (0) 2023.01.30
[BOJ] 6593. 상범 빌딩 Python  (0) 2023.01.29
[BOJ] 10026. 적록색약 Python, Java  (1) 2023.01.28
[BOJ] 2573. 빙산  (0) 2023.01.23