관리 메뉴

커리까지

[백준] 16953번 A->B 본문

알고리즘/풀이

[백준] 16953번 A->B

목표는 커리 2022. 12. 11. 17:09
728x90
SMALL

문제

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.

  • 2를 곱한다.
  • 1을 수의 가장 오른쪽에 추가한다.

A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.

입력

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

출력

A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.

예제 입력 1
2 162
예제 출력
5

2 → 4 → 8 → 81 → 162

예제 입력 2
4 42
예제 출력 2
-1
예제 입력 3
100 40021
예제 출력 3
5

100 → 200 → 2001 → 4002 → 40021

제출 답안

  • 2를 곱하거나 1을 붙이는 방법을 계속해서 q에 넣는 게 핵심이다.
    • 어차피 cnt를 같은 숫자에서 파생되었으니 4이던 41이던 2 다음에 오는 경우여서 1을 가지게 된다.
'''
1. 아이디어
- 더하기나, 곱하기한 값과 횟수를 큐에 삽입
2. 시간 복잡도
- O(V+E)
- V = 10^9
- E = 2v
= 3v = 3*(10^9) = 3,000,000,000

3. 자료구조
int []
'''
import sys
from collections import deque
input = sys.stdin.readline

a, b = map(int, input().split())
res = 0
q = deque([(a, res)])
while q:
    i, cnt = q.popleft()
    if i == b:
        res = cnt
        break
    if (n :=i *2) <= b:
        q.append((n, cnt+1))
    if (n:=int(f'{i}1')) <= b:
        q.append((n, cnt+1))
print( res + 1 if res != 0 else -1)
728x90
LIST
Comments