์ค๋ฒ1 : ๋์ ๊ณํ๋ฒ ๋ฌธ์ ์ด๋ค.
์๊ฐ
์ ํ์ ์ธ dp ๋ฌธ์ ์ด๋ค. ๋ค๋ง ์ด ๋ฌธ์ ๋, ๊ฒฝ๋ก๋ฅผ ์ถ์ ํด์ผ ํ๋ค๋ ์ ์์ ์กฐ๊ธ ๋ค๋ฅด๋ค. ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ dp๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํด๋๊ณ , ์ด๊ฒ์ ์ญ์ผ๋ก ์ถ์ ํ์ฌ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๋ค.
Code
#include<iostream>
#include<vector>
#include<algorithm>
#include<list>
#include<cmath>
#include<functional>
using namespace std;
int N;
int dp[1000001];
vector<int> trace;
void tracing(int num){
trace.push_back(num);
if (num == 1) return;
int before = num-1;
if (num%3 == 0) {
if (dp[before] > dp[num/3]) before = num/3;
}
if(num%2 == 0) {
if (dp[before] > dp[num/2]) before = num/2;
}
tracing(before);
}
int main(){
cin >> N;
dp[0] = 987654321;
for (int i = 2; i <= N; i++) {
dp[i] = dp[i-1] + 1;
if (i%3 == 0) {
dp[i] = min(dp[i], dp[i/3]+1);
}
if (i%2 == 0){
dp[i] = min(dp[i], dp[i/2]+1);
}
}
tracing(N);
cout << dp[N] << endl;
for (int i = 0; i < trace.size(); i++) {
cout << trace[i] << ' ';
}
return 0;
}