https://www.acmicpc.net/problem/1463
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int ret = -1;
void BFS(int num) {
queue < pair<int, int>> q;
q.push(make_pair(num, 0));
while (!q.empty()) {
int num = q.front().first;
int count = q.front().second;
q.pop();
if (num == 1) {
ret = min(ret, count);
return;
}
if (num % 3 == 0) q.push(make_pair(num / 3, count + 1));
if (num % 2 == 0) q.push(make_pair(num / 2, count + 1));
q.push(make_pair(num - 1, count + 1));
}
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
ret = n;
BFS(n);
cout << ret << "\n";
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> dp(n+1);
dp[1] = 0;
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);
}
cout << dp[n]<<"\n";
return 0;
}
위의 채점 결과가 DP.
DP 가 훨씬 빠르고 메모리적으로 효율적인 것을 알 수 있다.