본문 바로가기

TIL

백준 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


주어진 2가지 경우로 이동하면서 목표지점으로 가는 문제였습니다. 이렇게 간선의 가중치가 두 종류로만 이루어진 문제를 0,1 BFS라고 부르며 데크를 사용하여 구현할 수 있습니다. 구현 과정은 다음과 같습니다.

  • 처음 시작지점을 데크에 넣어줍니다.
  • 데크의 가장 앞쪽 값을 pop 해 주어서 갈 수 있는 조건에 따라 시간을 구해 줍니다.
  • x-1, x+1 일때는 1초의 시간을 증가시켜 데크의 뒤쪽에 넣어주고,  2*x인 경우에는 시간이 걸리지 않으므로 데크의 앞쪽에 먼저 넣어줍니다.
  • 최종적으로 도착지점 K에 도달하면 걸린 시간을 출력해 줍니다.

소스코드 

from collections import deque
import sys
input = sys.stdin.readline


N, K = map(int, input().split())

MAX = 100001
ch = [0] * MAX
q = deque()
q.append((N, 0))

while q:
    tmp = q.popleft()
    if tmp[0] == K:
        print(tmp[1])
        break
    for next in [tmp[0]-1, tmp[0]+1, 2*tmp[0]]:
        if 0 <= next < MAX and ch[next] == 0:
            ch[next] = 1
            if next == tmp[0]-1 or next == tmp[0]+1:  # x+1,x-1 로 한칸 가는 경우
                q.append((next, tmp[1]+1))
            if next == tmp[0]*2:  # 2*x 만큼 가는경우
                q.appendleft((next, tmp[1]))  # 데크의 앞에 넣어준다

'TIL' 카테고리의 다른 글

백준 2638 치즈(python)  (0) 2021.08.25
백준 14226 이모티콘(python)  (0) 2021.08.24
백준 2637 장난감 조립(python)  (0) 2021.08.22
백준 2617 구슬 찾기(python)  (0) 2021.08.21
백준 3055 탈출(python)  (8) 2021.08.20