본문 바로가기
알고리즘/BOJ 풀이(C++)

[BOJ] A → B (16953)

by Develaniper 2021. 4. 22.

www.acmicpc.net/problem/16953

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

난이도 - 실버 1

문제

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.

  • 2를 곱한다.
  • 1을 수의 가장 오른쪽에 추가한다. 

A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.

입력

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

출력

A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.

 

 

코드

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int A, B;
int main() {
    cin >> A >> B;


    queue<vector<long long>> q;
    int ans = -1;
       q.push({ A, 1 });
    while (!q.empty()) {
        long long x = q.front()[0], cnt = q.front()[1];
        if (x == B) {
            ans = cnt; break;
        }
        q.pop();
        cnt++;
        if (x * 2 <= B) {
            q.push({ x * 2, cnt });
        }
        if (x * 10 + 1 <= B) {
            q.push({ x * 10 + 1, cnt });
        }
    }
    cout << ans;
    return 0;
}

풀이

단순한 BFS, DFS 풀이다.

단 최소 연산을 구하는 것에는 BFS가 더 빠른 연산을 낼 수 있다.

 

1. 만들 수 없는 경우에는 -1을 출력해야 하므로 ans의 기본값은 -1로 설정한다.

2. 초기 값인 A와 1(마지막에 1을 더해주는 대신 1을 넣는다.

3. BFS 작업을 한다. 여기서 주의 할 점은 10^9은 10억인데 10억의 맨 뒤에 1을 붙이면 100억이 되기 때문에 int로 표현 못하는 경우가 생기므로 x(계산한 식)를 long long 형으로 지정한다.

4. 만약 x*2, x*10+1(마지막에 1을 추가한 수) 가 B보다 크면 큐에 넣지 않고 작으면 넣는다.

5. BFS를 하다가 x==B이면 ans를 cnt로 설정하고 출력 후 종료

'알고리즘 > BOJ 풀이(C++)' 카테고리의 다른 글

[BOJ] 1학년(5557)  (0) 2021.05.04
[BOJ] 평범한 배낭(12856)  (0) 2021.05.04
[BOJ] BOJ거리(12026)  (0) 2021.05.03
[BOJ] 크리보드(11058)  (0) 2021.05.03
[BOJ] 퇴사 2(15486)  (0) 2021.04.27

댓글