백준 16953번 (A → B, C++) [BAEKJOON]

문제

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

plaintext
2 162
plaintext
5

2 → 4 → 8 → 81 → 162

예제 입/출력 2

plaintext
4 42
plaintext
-1

2 → 4 → 8 → 81 → 162

예제 입/출력 3

plaintext
100 40021
plaintext
5

100 → 200 → 2001 → 4002 → 40021

알고리즘 분류

출처


접근 방법

DFS(재귀)를 이용하여 해결

재귀를 수행하면서 조건을 만족할 수 없다면 Return

통과된 코드

cpp
#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