728x90
[C++] 백준 16953: A -> B
🥈실버 2
https://www.acmicpc.net/problem/16953
접근
거꾸로 생각해본다.
2 162 예의 경우
2 → 4 → 8 → 81 → 162
위와 같이 흘러가는데, 거꾸로 하면
162 -> 81 -> 8 -> 4 -> 2와 같이 흘러간다.
이렇게 보면 규칙을 쉽게 찾을 수 있다.
1. B가 2로 나눠지는 경우 2로 나누고 count++
2. B가 2로 안나눠지는데 맨 오른쪽에 1이 있으면 1지우고 count++
3. B가 2로 안나눠지는데 맨 오른쪽에 1도 없으면 그냥 안되는 거라서 -1 출력 후 프로그램 종료
예제 케이스 4 42를 거꾸로 하면 다음과 같이 흘러간다.
42 -> 21 -> 2 ? => -1 출력
A를 4, B를 42로 잡았을 때, B가 A보다 작아지는 경우 반복문에서 빠져나오고 -1을 출력하는 것으로 판단할 수 있었다.
위 규칙을 순서도로 그리면 대충 다음과 같다.
추가로 A==B 상황에서 count값을 그대로 출력하면 안된다.
162 -> 81 -> 8 -> 4 -> 2
잘 보면 count가 4번 올라가는 것을 확인할 수 있다.count를 0으로 선언했다면 count+1을 출력 해야한다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
string A, B;
cin >> A >> B;
int cnt = 0;
while ( stoi(A) < stoi(B) ) {
if (stoi(B) % 2 == 0) {
B = to_string(stoi(B) / 2);
cnt++;
}
else {
if (B[B.length()-1] != '1') { // 맨 오른쪽이 1이 아니면 -1 출력 후 종료
cout << -1;
return 0;
}
B.erase(B.end()-1); // 맨 오른쪽이 1이면 B의 맨 오른쪽 값 지우기
cnt++;
}
if (A == B) { // 위의 연산이 끝났을 때 cnt+1을 출력 후 종료
cout << cnt+1;
return 0;
}
}
cout << -1;
return 0;
}
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
자바 코테용 문법 정리 (2) | 2023.05.02 |
---|---|
[C++] 백준 1931: 회의실 배정 (0) | 2023.04.13 |
[C++] 백준 1541: 잃어버린 괄호 (2) | 2023.04.11 |
[c++] 백준 20365: 블로그2 (0) | 2023.04.11 |
[c++] 백준 20300: 서강근육맨 (0) | 2023.04.10 |