728x90
https://www.acmicpc.net/problem/12851
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
'Algorithm (PS)' 카테고리의 다른 글
[백준] 5639 이진검색트리 in Python : tree 전위순회의 특성을 이용한 풀이 + EOF를 이용해서 입력받기 (0) | 2022.02.25 |
---|---|
[백준] 10815 숫자카드 in Python : 이진탐색으로 시간단축하기 (0) | 2022.02.25 |
[백준] 17070 파이프 옮기기1 -> dfs로 풀기 vs DP로 풀기 (0) | 2022.02.22 |
[백준] 2263 트리의 순회 -> 트리의 inorder, postorder의 성질을 이해하자 (0) | 2022.02.21 |
[백준] 1918 후위표기식 Python - 자료구조 시간에 나온 stack 과제 (0) | 2022.02.21 |