Algorithm (PS)
[백준] 12851 숨바꼭질 2 in Python : bfs의 응용
minjiwoo
2022. 2. 25. 00:15
728x90
https://www.acmicpc.net/problem/12851
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
bfs로 풀기 위해서, 100001개의 공간이 필요하다 이 개수는 문제에서 주어진 노드의 범위(0<= n,k <= 100000)이다.
visited = [[-1, 0] for _ in range(100001)] # (cost , 방법의 개수)
각 노드에 대해 최소 비용도 구해야하고, 최소비용으로 가는 경우 방법을 카운트 해주어야 하기 때문이다
for 문으로 간단히 갈 수 있는 이동 방법의 경우를 체크한다 !!
for i in [now-1, now+1, now*2]:
처음으로 방문하는 경우와 이미 방문한 적 있는 경우 2가지로 나누어서 생각한다.
i) 처음으로 방문하는 경우
if visited[i][0] == -1: # 첫 방문
ii) 이미 현재 노드를 방문한 적 있는 경우
elif visited[i][0] == visited[now][0] + 1: # 이미 방문했다면, 최단거리인 경우에만 갱신함
최단거리인 경우에만 방법의 수를 업데이트 해준다. (더해준다)
visited[i][1] += visited[now][1] # i 까지 가는 방법의 수 갱신 !
# 12851
from collections import deque
n, k = map(int, input().split())
visited = [[-1, 0] for _ in range(100001)] # (cost , 방법의 개수)
def bfs():
q = deque()
q.append(n) # start node 는 n
visited[n][0] = 0
visited[n][1] = 1
while q:
now = q.popleft()
for i in [now-1, now+1, now*2]:
if 0 <= i <= 100000: # 주어진 범위
if visited[i][0] == -1: # 첫 방문
visited[i][0] = visited[now][0] + 1
visited[i][1] = visited[now][1] # 방법의 개수
q.append(i)
elif visited[i][0] == visited[now][0] + 1: # 이미 방문했다면, 최단거리인 경우에만 갱신함
visited[i][1] += visited[now][1]
bfs()
print(visited[k][0])
print(visited[k][1])
728x90