※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 12852번 문제인 1로 만들기 2이다.
문제는 아래 링크를 확인하자.

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

 

12852번: 1로 만들기 2

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

www.acmicpc.net

1부터 100만까지의 수 i를 둘러보면서 1로 만드는 과정 중 이 숫자 이전에 올 수 있었을 수(i*3, i*2, i+1)들의 차례를 한 번씩 확인해주는 것으로 문제를 해결할 수 있다. (또는 각 숫자를 노드로 생각하여 BFS를 사용할 수도 있다.)

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int dp[1000001];
int backtrack[1000001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	dp[1] = 1;

	for (int i = 1; i < 1000000; i++) {
		if (i * 3 < 1000000) {
			if (dp[i * 3] == 0 || dp[i * 3] > dp[i] + 1) {
				dp[i * 3] = dp[i] + 1;
				backtrack[i * 3] = i;
			}
		}
		if (i * 2 <= 1000000) {
			if (dp[i * 2] == 0 || dp[i * 2] > dp[i] + 1) {
				dp[i * 2] = dp[i] + 1;
				backtrack[i * 2] = i;
			}
		}
		if (i < 1000000) {
			if (dp[i + 1] == 0 || dp[i + 1] > dp[i] + 1) {
				dp[i + 1] = dp[i] + 1;
				backtrack[i + 1] = i;
			}
		}
	}

	int N; cin >> N;
	cout << dp[N] - 1 << '\n';
	while (N != 1) {
		cout << N << ' ';
		N = backtrack[N];
	}
	cout << 1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 6064 // C++] 카잉 달력  (0) 2021.06.28
[BOJ 16928 // C++] 뱀과 사다리 게임  (0) 2021.06.27
[BOJ 20305 // C++] 피보나치와 수열과 쿼리  (0) 2021.06.25
[BOJ 16953 // C++] A → B  (0) 2021.06.24
[BOJ 5000 // C++] 빵 정렬  (0) 2021.06.23

+ Recent posts