[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