바위 뚫는중

[BOJ] 백준 16953. A→B 본문

Algorithms/백준

[BOJ] 백준 16953. A→B

devran 2024. 2. 15. 15:49
반응형

🥈 A → B

문제

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

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

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

입력

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

출력

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

💡 아이디어

코딩테스트에서 많이 본 문젠데, 늘 제대로 잘 못풀었던 기억이 있다 😢

연산의 최솟값이므로 BFS를 이용한다! 비슷한 문제 중에서 최솟값이 아닌 경우 DFS를 이용하는 것도 꽤 있었던 것 같다.

B의 값이 완성될 때만 카운트를 출력하고 return해주고,

완성되기 전까지는 B를 초과하지 않는 선에서 *2 혹은 +1의 값을 queue에 넣어준다.

📝 풀이

import sys
from collections import deque

input = sys.stdin.readline

def bfs(a,b):
    q = deque([(a,1)])
    while q:
        now, cnt = q.popleft()
        if now == b:
            print(cnt)
            return
        if now * 2 <= b:
            q.append((now*2, cnt+1))
        if now * 10 + 1 <= b: #오른쪽에 추가하므로 *10을 한뒤 +1
            q.append((now*10+1, cnt+1))
    print(-1)

a, b = map(int, input().split())
bfs(a,b)
반응형

'Algorithms > 백준' 카테고리의 다른 글

[BOJ] 백준 11727. 2×n 타일링 2  (1) 2024.02.27
[BOJ] 백준 2512. 예산  (1) 2024.02.15
[BOJ] 백준 1303. 전쟁 - 전투  (1) 2024.01.25
[BOJ] 백준 1890. 점프  (1) 2024.01.24
[BOJ] 백준 21318. 피아노 체조  (0) 2023.12.28