※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |