@@@ 알고리즘/백준 스터디

16953(A → B) - 해결

HTG 2021. 10. 9. 00:16
728x90

A → B

 

문제

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

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

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

 

입력

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

 

출력

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


2배와 뒤에 1이 붙는 방법 밖에 없기 때문에 줄어드는 경우는 없다.

그래서 숫자가 타겟보다 크다면 넘기고 작을땜나 신경 쓰는 방법을 썼다.

import sys
input = sys.stdin.readline
from collections import deque

A, B = map(int,input().split())
# q 생성
q = deque([(A,0)])

# bfs
# 숫자가 작아지는 건 없기 때문에 작은 수들 중에서만
# 신경쓰는 방식을 사용
while q:
    # 숫자와 카운트
    num, cnt = q.popleft()

    # B에 도착하면 카운트 + 1하고 빠져나옴.
    if num == B:
        ans = cnt + 1
        break

    # 2배
    if num * 2 <= B:
        q.append((num*2,cnt+1))
    # 뒤에 1추가
    if int(str(num) + "1") <= B:
        q.append((int(str(num) + "1"),cnt+1))
# 없으면 -1
else:
    ans = -1
print(ans)

 

'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글

11559(Puyo Puyo) - 해결  (0) 2021.10.10
17392(우울한 방학) - 해결  (0) 2021.10.10
5904(Moo 게임) - 해결  (0) 2021.10.06
15270(친구 팰린드롬) - 해결  (0) 2021.10.05
22981(휴먼 파이프라인) - 해결  (0) 2021.09.29