[Baekjoon] 16953번 A → B
Updated:
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ $10^9$)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
예제
Example 1:
Input:
2 162
Output:
5
Example 2:
Input:
4 42
Output:
-1
Example 3:
Input:
100 40021
Output:
5
조건
시간 제한 : 2초
메모리 제한 : 512 MB
풀이과정
내 풀이
import heapq
a, b = map(int,input().split())
q = []
heapq.heapify(q)
# 초기 숫자와 필요한 연산갯수
heapq.heappush(q, (a,1))
ans = -1
while q:
x, cnt = heapq.heappop(q)
# 2를 곱한 수와 1을 수의가장 오른쪽에 추가한 수를 구한다.
y = x*2
z = int(str(x)+str(1))
# 바꾸려는 수가 나온다면 답을 갱신하고 while문을 멈춘다.
if y == b or z == b:
ans = cnt+1
break
# 바꾸려는 수보다 작을 때만 추가해준다.
if y <= b:
q.append((y,cnt+1))
if z <= b:
q.append((z,cnt+1))
print(ans)
Leave a comment