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

A → B

https://www.acmicpc.net/problem/16953

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초512 MB61243252751999639.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

출처

알고리즘 분류

통과된 코드

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

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤