Baekjoon Review

[Silver 3] 1463번 1로 만들기

hanseongbugi 2023. 11. 2. 19:24

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

이 문제는 BFS를 사용해서 해결할 수 있다.

현재 queue에 있는 값이 1이면 연산 횟수를 저장하고 반복을 멈춘다.

값이 3으로 나눠 떨어지거나 2로 나눠 떨어지면 queue에 값을 3이나 2로 나누고 연산 횟수를 저장한다.

또한 값을 1로 뺀 값과 연산 횟수를 저장한다.

 

#include <iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

int x, result;
queue<pair<int,int>> q;

void bfs() {
	q.push(make_pair(x,0));

	while (!q.empty()) {
		int value = q.front().first;
		int counter = q.front().second;
		q.pop();

		if (value == 1) {
			result = counter;
			break;
		}

		if (value % 3 == 0) q.push(make_pair(value/3, counter + 1));

		if (value % 2 == 0) q.push(make_pair(value / 2, counter + 1));

		q.push(make_pair(value - 1, counter + 1));
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> x;
	bfs();
	cout << result << '\n';
}