728x90

문제

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

 

13549번: 숨바꼭질 3

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

www.acmicpc.net

 

풀이

BFS(너비 우선 탐색)를 사용해 풀었습니다.

범위 내에 이동할 수 있으면 방문 처리와 큐에 (이동 위치, 시간)을 추가합니다.

※ 두 배 이동한 경우를 우선으로 확인해야 하므로 append()가 아닌 appendleft()를 해줘야 합니다.

앞서 방문한 위치는 다시 방문하지 않으므로 한 칸 이동한 경우보다 두 배 이동한 경우를 먼저 확인해야 합니다.

 

코드

파이썬
from collections import deque
import sys

input = sys.stdin.readline


def BFS():
    queue = deque()
    visited = [False] * 100001
    visited[N] = True
    queue.append((N, 0))
    while queue:
        x, t = queue.popleft()
        if x == K:
            return t
        if 0 <= (2 * x) <= 100000 and not visited[2 * x]:
            visited[2 * x] = True
            queue.appendleft((2 * x, t))
        if 0 <= (x - 1) <= 100000 and not visited[x - 1]:
            visited[x - 1] = True
            queue.append((x - 1, t + 1))
        if 0 <= (x + 1) <= 100000 and not visited[x + 1]:
            visited[x + 1] = True
            queue.append((x + 1, t + 1))


N, K = map(int, input().split())
print(BFS())
728x90

'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글

[프로그래머스] 크레인 인형뽑기 게임  (0) 2023.03.16
[백준] 9019번: DSLR  (0) 2023.03.16
[백준] 1525번: 퍼즐  (0) 2023.03.04
[백준] 2251번: 물통  (0) 2023.03.04
[백준] 14503번: 로봇 청소기  (0) 2023.03.03
딩딩크롱