그리디 문제입니다.
A를 B로 만드는 방법을 찾는 방법과 B를 A로 만드는 방법이 있습니다.
후자의 경우가 훨씬 간단하고 쉽기 때문에 모두 후자로 푸는거 같습니다.
A를 B로 만들기 위해선 A에 2를 곱한 경우와 1을 추가한 경우 모두 방문여부를 확인하고 이것저것 계산하여 B가 최종적으로 되는지 계산해야 하고,
B를 A로 만들기 위해선 B가 2가 곱해져 있는지(짝수인지)와 일의자리가 1인지만 계산하여 연산을 해주고 두 경우가 모두 아니면 A를 만들 수 없기에 -1을 출력하고 종료할 수 있습니다.
실버 2
시간 제한 | 메모리 제한 |
---|---|
2 초 | 512 MB |
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
2를 곱한다.
1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
2 162
2 → 4 → 8 → 81 → 162
5
4 42
-1
100 40021
100 → 200 → 2001 → 4002 → 40021
5
b를 a로 만드는 방법으로 문제를 해결하였다.
a, b = map(int, input().split())
ans = 1 # 문제에 따르면 최소 연산값에 1을 더해야 함
while a < b: # 조건식은 b로 해도 되고 a != b로 해도 상관없음
if b % 2 == 0: # b가 짝수라면 2로 나눔
b //= 2
elif b % 10 == 1: # b의 일의자리가 1이라면 10으로 나누어 1 제거
b //= 10
else: # a가 b와 같아지려면 위 두 조건을 무조건 성립해야 하기에, 성립하지 않으면 답은 -1
break
ans += 1 # 연산 카운트 증가
print(ans if a == b else - 1) # while문이 break에 걸린 경우 a와 b가 같지 않기에 -1이 출력