정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
BFS
로 풀었다.queue
에서 꺼낸 값을 2배 한 값과 10배 +1 한 값 중 목표 값과 같은 것이 있다면 해당 depth를 기록하고 반복 종료#include <iostream>
#include <queue>
#define INF 1e9
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int start, target;
cin >> start >> target;
queue<pair<long long, int>> q;
q.push({ start,1 });
int min_depth = -1;
while (!q.empty()) {
long long x = q.front().first;
int depth = q.front().second;
q.pop();
long long attached_number = x * 10 +1;
long long doubled_number = x * 2;
if (attached_number == target || doubled_number == target) {
min_depth = depth + 1;
break;
}
if (attached_number < target) q.push({ attached_number, depth + 1 });
if (doubled_number < target) q.push({ doubled_number, depth + 1 });
}
cout << min_depth;
}