백준 12851번 숨바꼭질 2 파이썬

박슬빈·2021년 11월 22일
0

알고리즘

목록 보기
31/40

문제

입력 , 출력

solution

import sys
from collections import deque

input = sys.stdin.readline

Max = 100001
n, m = map(int, input().split())
dq = deque()
dq.append(n)
dis = [-1 for _ in range(Max)]
dis[n] = 0
res = 0
if n == m:
    res = 1
while dq:
    a = dq.popleft()
    if a * 2 < Max:
        if dis[a * 2] == -1:
            dq.append(a * 2)
            dis[a * 2] = dis[a] + 1
        elif dis[a * 2] == dis[a] + 1:
            dq.append(a * 2)
        if a * 2 == m and dis[a] + 1 == dis[m]:
            res += 1
    if a + 1 < Max:
        if dis[a + 1] == -1:
            dq.append(a + 1)
            dis[a + 1] = dis[a] + 1
        elif dis[a + 1] == dis[a] + 1:
            dq.append(a + 1)
        if a + 1 == m and dis[a] + 1 == dis[m]:
            res += 1
    if a - 1 >= 0:
        if dis[a - 1] == -1:
            dq.append(a - 1)
            dis[a - 1] = dis[a] + 1
        elif dis[a - 1] == dis[a] + 1:
            dq.append(a - 1)
        if a - 1 == m and dis[a] + 1 == dis[m]:
            res += 1
print(dis[m])
print(res)

설명

키포인트

  1. (예외처리) n == k 일 경우에는 res 0 , 1 이 출력되어야함
  2. 방문처리 , EX) 10이란 숫자에 방문횟수가 1번 이상일수도 있다.

예외처리만 잘 해주면
BFS만 하면 정답이 나오는 것 같다.

profile
이것저것합니다

0개의 댓글