본문 바로가기
Algorithm/BOJ

[백준] 12581번 - 숨바꼭질 2 (파이썬)

by _temp 2022. 1. 21.

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

# 숨바꼭질 2
from collections import deque


def bfs(start):
    global result
    q = deque()
    q.append(start)
    arr[start] = 0
    while q:
        x = q.popleft()
        if x == K:
            result += 1
            continue
        for nx in (x*2, x+1, x-1):
        	# 최소시간이 arr[K]에 이미 있는 경우에는 같을 때도
            # q.append해서 result가 증가될 수 있도록
            if 0 <= nx < 100001 and (arr[nx] == arr[x] + 1 or arr[nx] == -1):
                arr[nx] = arr[x] + 1
                q.append(nx)


N, K = map(int, input().split())
arr = [-1] * 100001
result = 0

bfs(N)

print(arr[K])
print(result)

 

BFS

1. q가 빌때까지 x+1, x-1, x*2로 이동을 반복을 한다. (우선순위를 x*2로 두었다)

  - arr[nx]에 이전시간+1 을 해주고 q에 append (첫 방문이거나 시간이 같은 경우)

  - x가 동생의 위치(K)이면 result += 1 (가능한 경우의 수 1증가)

2. 최소 시간과 경우의 수 출력