백준 알고리즘(C++)

백준 12852번 1로 만들기 2 ( C++ )

coding232624 2024. 9. 18. 11:30

문제

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

 

해설

경우의 수만 구하면 된다면 dp를 이용해서 간단하게 구할 수 있음

하지만 이동 경로를 표시해야 하기 때문에 그 점을 기록하기 위한 last배열을 선언

재귀를 통해 구현하였을 경우 깊이 문제가 발생하여 반목문으로 해결

 

코드

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
#include<iostream>
#include<algorithm>
 
using namespace std;
typedef long long ll;
 
int n, visited[1000004],last[1000004];
 
void go(int num) {
    visited[1= 0
    for (int i = 2; i <= num; i++) {
        visited[i] = visited[i - 1+ 1;  
        last[i] = i - 1;
 
        if (i % 2 == 0 && visited[i] > visited[i / 2+ 1) {
            visited[i] = visited[i / 2+ 1;
            last[i] = i / 2;
        }
 
        if (i % 3 == 0 && visited[i] > visited[i / 3+ 1) {
            visited[i] = visited[i / 3+ 1;
            last[i] = i / 3;
        }
    }
}
 
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);cout.tie(NULL);
 
  cin >> n;
  go(n);
  cout <<visited[n]<<"\n";
  int tmp = last[n];
  cout << n<<" "
  for(int i=0; i< visited[n];i++){
    cout << tmp <<" ";
    tmp = last[tmp];
  }
}
cs