728x90
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
예제 입력 1 복사
2 162
예제 출력 1 복사
5
오랜만에 풀어보는 유형의 bfs 문제였다.
큐 안에 값을 넣어서 한번은 *2를 한번은 *10 + 1을 해주며 B값을 몇번만에 얻을 수 있는지를 구하면 된다.
A와 B의 범위가 int 범위이므로 visit 배열을 사용할 순 없었고, map을 이용해서 방문 여부와 몇 번 만에 방문했는지를 기록했다.
주의할 점은 큐 안에 넣는 수가 int 범위를 넘지 않도록 long long 변수를 사용하거나 직접 조건문을 이용해 처리해주자.
chosh95/STUDY
프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.
github.com
C++ 코드
#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
int A, B, res = -1;
map<int, int> m;
void bfs()
{
queue<int> q;
q.push(A);
m[A] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
int cnt = m[cur];
if (cur > B) continue;
if (cur == B) {
res = cnt;
return;
}
if (m[cur * 2] == 0) {
m[cur * 2] = cnt + 1;
q.push(cur * 2);
}
if (cur >= 100000000) continue;
int next = cur * 10 + 1;
if (m[next] == 0) {
m[next] = cnt + 1;
q.push(next);
}
}
}
int main()
{
cin >> A >> B;
bfs();
cout << res;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 문자열 폭발 (9935번) (0) | 2020.07.13 |
---|---|
[백준] N과 M (12) (15666번) (0) | 2020.07.13 |
[백준] 작업 (2056번) (0) | 2020.07.05 |
[백준] N과 M (9) (15663번) (0) | 2020.07.04 |
[백준] N과 M (8) (15657번) (0) | 2020.07.04 |