A → B 
https://www.acmicpc.net/problem/16953
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 2 초 | 512 MB | 61243 | 25275 | 19996 | 39.758% |
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다.
만들 수 없는 경우에는 -1을 출력한다.
예제 입/출력 1
2 162
5
2 → 4 → 8 → 81 → 162
예제 입/출력 2
4 42
-1
2 → 4 → 8 → 81 → 162
예제 입/출력 3
100 40021
5
100 → 200 → 2001 → 4002 → 40021
출처
- 문제를 번역한 사람: baekjoon
알고리즘 분류
통과된 코드
DFS(재귀)를 이용하여 해결
재귀를 수행하면서 조건을 만족할 수 없다면 Return
#include <iostream>
using namespace std;
int MinRes = INT16_MAX;
long long int Target = 0;
void Recursion(int _depth, long long int _val) {
// 목표 값보다 크면 반환
if (_val > Target)
return;
// 현재 깊이가 최소값보다 크면 반환
if (_depth > MinRes)
return;
// 목표 값에 도달하면 최소 깊이 갱신
if (Target == _val) {
MinRes = min(MinRes, _depth);
return;
}
// 재귀 호출을 통해 2를 곱하거나 1을 추가
Recursion(_depth + 1, _val * 2);
Recursion(_depth + 1, (_val * 10) + 1);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long int Start = 0;
cin >> Start >> Target;
// 초기 깊이는 1로 설정
Recursion(1, Start);
// 결과 출력: 만들 수 없는 경우 -1 출력
if (INT16_MAX == MinRes)
cout << -1;
else
cout << MinRes;
}

int => long long int

![백준 1932번 (정수 삼각형, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/boj-og.png)

![백준 9205번 (맥주 마시면서 걸어가기, C++) [BAEKJOON]](https://lycos7560.com/wp-content/uploads/2022/10/boj-og-1-2048x1070-1-1024x535.png)