[BOJ] 12852번 1로 만들기 2 - C++

"동적 계획법과 최단거리 역추적"

Posted by Yongmin on August 7, 2021

문제

1로 만들기 2

풀이

top-down(bfs) 방식으로 구현하다가, bottom-up 방식으로 바꿔 풀었다. n까지 도달하기 위해 걸린 cnt를 저장하고 있는 dp배열을 이용하여 1부터 시작하여, 기존 값과 비교하여, 새로 구한 값이 더 작으면 dp값에 넣는 식으로 코드가 진행된다. 이 때, before함수를 통해 그 전의 값들이 먼지 역추적을 하게끔 저장되어 있다. 이들을 각각 정답에 맞게 출력해준다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <vector>

using namespace std;

int main(){
    int N;
    scanf("%d", &N);
    
    vector<int> dp(N+1);
    vector<int> before(N+1);
    
    dp[1] = 0;
    for(int i = 2; i<=N; i++){
        dp[i] = dp[i-1] + 1;
        before[i] = i-1;
        
        if(i%2 == 0 && dp[i] > dp[i/2] + 1){
            dp[i] = dp[i/2] + 1;
            before[i] = i/2;
        }
        
        if(i%3 == 0 && dp[i] > dp[i/3] + 1){
            dp[i] = dp[i/3] + 1;
            before[i] = i/3;
        }
    }
    
    printf("%d\n", dp[N]);
    
    printf("%d ", N);
    
    int index = N;
    int x;
    while(1){
        x = before[index];
        if(x == 0) break;
        printf("%d ", x);
        index = x;
        
    }
    
    
}


# # #