https://www.acmicpc.net/problem/16953
이 문제는 정수 A,B가 주어지고 A를 2를 곱하거나, 오른쪽에 1을 더하는 과정을 몇 번을 해야 B가 되는지를 출력하는 문제이다.
필자는 이 문제를 BFS를 응용하여 조건을 하나하나 따져가며 스택에 넣어가며 탐색을 하는 식으로 풀었다. 만약 만들어낸 숫자가 B보다 크다면 이 과정에서는 작아지는 과정이 없으므로 바로 스택에서 빼버리는 식으로 풀었다.
def A_to_B(A,B):
stack = [(A,1)]
ans = -1
while stack:
now,route = stack.pop()
new1 = now*2
new2 = int(str(now)+'1')
if new1==B or new2==B:
ans = route+1
break
if new1 < B:
stack.append((new1,route+1))
if new2 < B:
stack.append((new2,route+1))
return ans
A,B = map(int,input().split())
print(A_to_B(A,B))
'문제해결(PS) > 백준(BOJ)' 카테고리의 다른 글
백준 1629 곱셈 (0) | 2024.12.28 |
---|---|
백준 1149 RGB거리 (0) | 2024.12.27 |
백준 15666 N과 M (12) (0) | 2024.12.25 |
백준 15663 N과 M (9) (0) | 2024.12.25 |
백준 11725 트리의 부모 찾기 (0) | 2024.12.25 |