Algorithm/BOJ

[백준] #16953 A → B

jHoon0223 2021. 8. 23. 17:04

16953번: A → B (acmicpc.net)

 

16953번: A → B

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

www.acmicpc.net

백준 #12904 A와 B와 상당히 유사한 문제이다. 다른점이라고 한다면, data-type이 string이 아닌 int 라는 점..?

알고리즘 분류는 그래프와 BFS로 되어있던데, 굳이 BFS를 활용하지 않아도 충분히 풀 수 있다.


  • 풀이

B에서 A를 만드는 알고리즘으로 바꾸어 생각해보자.

그렇다면 적용할 수 있는 연산은 B에 따라 총 3가지로 정해지게 된다.

case 1. B의 마지막 숫자가 1인 경우 : 10으로 나누어 줌 (마지막 숫자인 1을 없애주는 효과)
case 2. B가 짝수인 경우 : 2로 나누어 줌
case 3. B의 마지막 숫자가 1이 아닌 홀수인 경우 : A에 어떤 수가 와도 만들어질 수 없는 경우 이므로, break로 반복문 탈출

B가 A보다 작아질 경우, 반복문을 탈출하고 적절히 출력

B에 따라 명확한 규칙성이 생기기 때문에 훨씬 더 쉽게 구현할 수 있다.


  • 구현
#include <iostream>

using namespace std;

int main() {
    long long A, B, cnt = 0;
    cin >> A >> B;

    bool flag = false;

    while(B >= A) {
        if (A == B) {
            flag = true;
            break;
        }
        if (B%10 == 1) {
            B /= 10;
            cnt++;
        }
        else if (B%2 == 0) {
            B /= 2;
            cnt++;
        }
        else break;
    }
    flag ? cout << cnt+1 : cout << -1;

    return 0;
}

case 3의 경우를 고려하지 않아서 두번 정도 틀렸다.

입력의 worst-case가 10억 밖에 안되기에 data-type은 int든, long long이든 상관없는 듯 했다. 

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[백준] #1181 단어 정렬  (0) 2022.08.01
[백준] #1946 신입사원  (0) 2021.09.28
[백준] #12904 A와 B  (0) 2021.08.22
[백준] #1918 후위 표기식  (0) 2021.08.22
[백준] #17609 회문  (0) 2021.08.19