백준비단뱀 12851호: 숨바꼭질 2

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

12851호 숨바꼭질 2

수빈은 남동생과 숨바꼭질을 하고 있다. 수빈은 현재 포인트 N(0 ≤ N ≤ 100,000)에 있고, 동생은 포인트 K(0 ≤ K ≤ 100,000)에 있다. 수빈은 걷거나 텔레포트할 수 있다. 수빈의 위치가 X라면

www.acmicpc.net


경로의 수를 찾는 문제

import sys
import collections

sys.stdin = open('C:/Users/USER/Desktop/vs/py/py1/input.txt', 'r')


def input():
    return sys.stdin.readline().strip()

# ==================================================================================


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

visited = (-1 for i in range(100001))
visited(N) = 0

q = collections.deque()
q.append(N)

while q:    #BFS
    pos = q.popleft()
    if pos == K:    #K에 도달하면 break
        break

    pos_list = (pos+1, pos-1, pos*2)    #갈 수 있는 방향

    for i in pos_list:
        if 0 <= i <= 100000:    #범위 안이면
            if visited(i) == -1:    #방문하지 않았던 곳이면
                q.append(i) #큐에 i push
                visited(i) = visited(pos)+1


path = 0    #경로 수
q = collections.deque()
q.append(K)
while q:    #BFS
    n = q.popleft()

    if n == N:  #N에 도달하면 path +1
        path += 1
    else:
        if n % 2 == 0:  #짝수면 세 방향으로 되돌아갈 수 있음
            n_list = (n+1, n-1, n//2)
        else:   #홀수면 두 방향으로 되돌아 갈 수 있음
            n_list = (n+1, n-1)

        for i in n_list:
            if 0 <= i <= 100000:    #범위 안일 경우만
                #되돌아간 곳의 시간이 지금보다 -1 이면 현재까지는 옳은 경로
                if visited(i) == visited(n)-1:  
                    q.append(i) #i 추가

print(visited(K))   #걸리는 시간
print(path) #경로 수

BFS를 두 번 사용하여 해결

왔던 길을 되돌아가면서 시간이 맞는지 확인하는 메소드를 작성했습니다.