Solved.ac 실버2
https://www.acmicpc.net/problem/16953

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
알고리즘 분류
- 그래프 이론
- 그리디 알고리즘
- 그래프 탐색
- 너비 우선 탐색
그래프로도 풀 수는 있지만, B를 A로 변환하면서 찾는 것이 더 확실하게 찾을 수 있다.
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int A, B;
int solve() {
int ret = 0;
while (B > A) {
if (B%10 == 1) B /= 10;
else if (B%2 == 0) B /= 2;
else return -1;
ret++;
}
if (B == A) return ret + 1;
else return -1;
}
int main() {
fastio;
cin >> A >> B;
cout << solve();
return 0;
}