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