[백준] Baekjoon Online Judge
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
풀이
#include <iostream>
using namespace std;
int A, B, cnt = -1;
void AtoB(long n, int now);
void AtoB(long n, int now) {
if (n == B) {
if (cnt == -1) cnt = now;
else cnt = min(cnt, now);
return;
}
if (n * 2 <= B) AtoB(n * 2, now + 1);
if (n * 10 + 1 <= B) AtoB(n * 10 + 1, now + 1);
}
int main() {
cin >> A >> B;
AtoB(A, 1);
cout << cnt << '\n';
return 0;
}
재귀함수를 사용하여 A를 B로 바꾸는데 필요한 연산의 최솟값을 구했다. 이때 오버플로가 발생할 수 있는 AtoB의 n은 long으로 선언했다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 11660번 - 구간 합 구하기 5 (0) | 2023.09.20 |
---|---|
[Baekjoon/C++] 1629번 - 곱셈 (0) | 2023.09.19 |
[Baekjoon/C++] 26099번 - 설탕 배달 2 (0) | 2023.09.16 |
[Baekjoon/C++] 29699번 - Welcome to SMUPC! (0) | 2023.09.15 |
[Baekjoon/C++] 15990번 - 1, 2, 3 더하기 5 (0) | 2023.09.14 |