알고리즘 모음(C++)

백준 16953 - A -> B 본문

백준

백준 16953 - A -> B

공대생의 잡다한 사전 2021. 6. 30. 23:53

문제 링크입니다. https://www.acmicpc.net/problem/16953

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

기본적인 그래프 문제였습니다.

수 A를 입력받아서 B에 도달할 때까지 최소 연산의 수를 구하는 문제입니다.

수는 2배증가 or 뒤에 1붙이기 를 통해서 연산할 수 있습니다.

 

ex) A : 2

     B : 162

     2 -> 4 -> 8 -> 81 -> 162

     이와 같은 방법으로 최소 횟수는 5입니다.

 

1. 주어지는 수의 범위가 10^9이기 때문에 int 범위는 넘습니다. 따라서 long long 형으로 선언해줍니다.

2. 처음에 큐에 (A,0)를 저장해서 BFS를 시작합니다.

3. X*2, X*10+1 각각 B 이하일때까지 횟수를 증가시키면서 큐에 넣습니다.

4, X가 B와 같은 지점이 있다면 횟수를 출력하고 종료합니다.

5. BFS가 끝났는데도 도달하지 못했다면 -1를 출력합니다

 

자세한 것은 코드를 참고해주세요

 

#define CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

long long int num, want;
queue<pair<long long int, long long int>> q;


int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> num >> want;
	q.push(make_pair(num, 0));
	while (!q.empty()) {
		long long int x = q.front().first;
		long long int cnt = q.front().second;
		long long int plus_one = x * 10 + 1;
		//cout << x << " " << cnt<< "\n";
		q.pop();
		if (x == want) {
			cout << cnt + 1;
			return 0;
		}
		else {
			if (plus_one <= want) {
				q.push(make_pair(plus_one, cnt + 1));
			}
			if (x*2 <= want) {
				q.push(make_pair(x * 2, cnt + 1));
			}
		}
	}
	cout << "-1";
	return 0;
}

 

질문 및 조언 댓글 남겨주세요

'백준' 카테고리의 다른 글

백준 1937 - 욕심쟁이 판다(복습)  (0) 2021.07.01
백준 1874 - 스택 수열(복습)  (0) 2021.07.01
백준 17144 - 미세먼지 안녕!  (0) 2021.06.30
백준 9935 - 문자열 폭발(복습)  (0) 2021.06.28
백준 1043 - 거짓말  (0) 2021.06.28