(Python) 백준 16953번 A -> B - class 4
[문제 링크]
16953번 A -> B
접근 방법
문제를 보고 일반적인 다이나믹프로그래밍 문제라고 생각했으나 범위를 보고 다른 풀이를 생각해야 했다. 범위가 매우 넓다보니 다이나믹 프로그래밍으로 하기에는 시간초과가 나올 것이 분명했기 때문이다. 따라서 큐에 시작 위치를 넣고 빼내면서 b보다 큰 경우 더이상 삽입하지 않고 b보다 작은 경우 가능한 연산 2가지를 하고 다시 큐에 넣는 방식으로 설계했다.
해결
- 첫 위치와 비용을 큐에 삽입
- 큐에서 꺼낸 값이 b보다 큰 경우 무시
- 큐에서 꺼낸 값이 b와 같은 경우 이전 정답과 비교 min 사용
- 큐에서 꺼낸 값이 b보다 작은 경우 가능한 2가지 연산 후 다시 큐에 삽입
- 큐가 빌 때까지 반복하고 정답 출력
from collections import deque
INF = int(1e9)
a, b = map(int, input().split())
ans = INF # 정답
q = deque()
q.append((a, 0)) # 첫 위치 삽입
while q:
dp, cnt = q.popleft()
# dp가 b일 경우 정답 수정
if dp == b:
ans = min(ans, cnt)
continue
# dp가 b보다 작으면 2배와 1추가 과정후 삽입
if dp < b:
q.append((dp * 10 + 1, cnt + 1))
q.append((dp * 2, cnt + 1))
# 도달 불가능
if ans == INF:
print(-1)
# 도달 가능
else:
print(ans + 1)