코딩 테스트/백준 문제 풀이

[백준 - Python] 16953. A → B (그리디)

빛나무 2024. 1. 3. 18:17

https://www.acmicpc.net/problem/16953

 

16953번: A → B

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

www.acmicpc.net

 

코드

# 2로 나눠지면 나누기
# 일의 자리 수가 1이면 1 제거하기

a, b = map(int, input().split())
cnt = 0
while b > 0:
    if b % 2 == 0:
        b //= 2
        cnt += 1
    elif b % 10 == 1:
        b //= 10
        cnt += 1
    else:
        if a == b:
            cnt += 1
            break
        cnt = -1
        break
    if a == b:  # 추가
        cnt += 1
        break
    if b <= 0:
        cnt = -1

print(cnt)

 

문제는 A를 B로 바꾸는데 필요한 최소 연산 횟수이지만,

A→B 방향으로는 최소 연산 횟수를 구하기는 어렵겠다고 판단했다.

 

연산의 특징을 보았을 때,

B에서 역으로 연산을 확인하면서 만족하는 A가 존재하는지 확인하는 방식으로 문제를 해결했다.