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 변수를 사용하거나 직접 조건문을 이용해 처리해주자.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/A%20%E2%86%92%20%20B%20(16953%EB%B2%88).cpp

 

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

+ Recent posts