728x90
https://www.acmicpc.net/problem/16953
16953번: A → B
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
www.acmicpc.net
접근 방법
처음엔 a를 기준으로 다음과 같이 해결했다.
i) if(a*10+1 <= b) { a에 a*10+1 }
ii) else { a = a * 2 }
여기서 틀린 점을 생각해보면
마지막에 1을 붙일 수 있으면 붙이기 때문에, ㅁ --(*2)--> ㅁ --(*2)-->ㅁ 인 경우에 정답을 피해갈 수 있다.
여기서 착안한 것이 b를 기준으로 해보자는 것.
b를 기준으로 끝이 1이면 띄어 버리면 된다.
근데 여기서도 문제가 존재한다.
예를 들어 11 33을 보자.
정답은 당연히 -1이다.
그러나 33/2를 하면 소수부분이 날라가기 때문에, 2로 나누어 떨어질때만 /2 를 하도록 설정
정리하자면.
1) if(b%10 == 1) { b/=10 }
2) else if(b%2 == 0) { b/=2 }
3) else { break }
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
#include <string>
using namespace std;
string ca, cb;
long long a, b;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> a >> b;
long long cnt = 0;
while (b > a) {
if (b % 10 == 1) {
//cout << "a: " << a << " , b: " << b << endl;
b /= 10;
}
else if (b % 2 == 0) {
b /= 2;
}
else {
//cout << "a: " << a << " , b: " << b << endl;
break;
}
cnt++;
}
if (a == b) {
cout << cnt + 1;
}
else {
cout << -1;
}
}

728x90
'📊알고리즘 > BOJ' 카테고리의 다른 글
[그리디 #16] BOJ 19598 - 최소 회의실 개수 (0) | 2024.02.19 |
---|---|
[그리디 #15] BOJ 1700 - 멀티탭 스케줄링 (0) | 2024.02.16 |
[그리디 #13] BOJ 13164 - 행복 유치원 (1) | 2024.02.14 |
[그리디 #12] BOJ 20365 - 블로그2 (0) | 2024.02.13 |
[그리디 #11] BOJ 20300 - 서강근육맨 (0) | 2024.02.12 |