코딩테스트/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;
}