코딩테스트/Baekjoon

[백준 #16953] A → B (C++)

동띵 2022. 3. 19. 22:44

 

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

 

16953번: A → B

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

www.acmicpc.net

A와 B의 값이 같을 때는 break를 사용해 while 문을 종료시키고,

A가 B보다 크거나, B가 1로 끝나지 않고 2로 나누어 떨어지지 않을 때는 -1을 출력하게 했다.

그리고 B가 1로 끝나면 마지막 자릿수(1)를 제외한 값을 B에 넣어주었고,

B가 2로 나누어 떨어지면 B를 2로 나눈 값을 B에 넣어주었다.

 

위 두개의 연산을 할 때마다 cnt++를 실행해주었고,

출력 조건이 필요한 연산의 최솟값에 1을 더한 값을 출력하는 것이므로

cnt의 초깃값을 0이 아닌 1로 설정해주었다.

 

***

B가 1로 끝나는지 판단하기 위해 나머지 연산자를 사용하여

B % 10를 통해 판단하였다.

만약 B가 1로 끝난다면 입력받은 B를 to_string을 사용하여 문자열로 바꾼 후

substr로 마지막 부분을 제외한 값을 다시 문자열에 넣고 stoi를 사용하여 

정수형으로 바꾸어 B에 넣어주었다.

***

 

#include <iostream>
#include <string>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int a, b, cnt = 1;
    cin >> a >> b;

    string b_str;

    while (true)
    {
        if (a == b)
        {
            break;
        }
        else if (a > b || b % 10 != 1 && b % 2 != 0)
        {
            cnt = -1;
            break;
        }
        else if (b % 10 == 1)
        {
            b_str = to_string(b);
            b_str = b_str.substr(0, b_str.length() - 1);
            b = stoi(b_str);
            cnt++;
        }
        else if (b % 2 == 0)
        {
            b /= 2;
            cnt++;
        }
    }
    cout << cnt;

    return 0;
}