다이나믹 프로그래밍 문제이다.
실버 문제라서 그런지 식이 바로 떠올라서 바로 풀었다.
가장 i =1 부터 i+1 , i *2 , i*3 을 하나씩 계산해 주면 된다.
사실 3번 틀렸는데 이유가 dp[1] = 1이 아니라 dp[1] =0 이다.
dp[1] =1이라고 하면 100% 까지 가서 틀렸습니다가 뜬다.
#include <bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 987654321
typedef long long ll;
using namespace std;
int num;
int cnt=0;
int dp[1000005];
int main() {
cin >> num;
for (int i = 1; i <= num; i++) {
dp[i] = INF;
}
dp[1] = 0;
dp[2] = 1;
dp[3] = 1;
for (int i = 1; i <= num; i++) {
if (i + 1 <= num)
dp[i + 1] = min(dp[i]+1, dp[i + 1]);
if (i * 2 <= num)
dp[i * 2] = min(dp[i] + 1, dp[i * 2]);
if(i*3 <= num)
dp[i * 3] = min(dp[i] + 1, dp[i * 3]);
}
cout << dp[num];
}
dp 문제는 코딩은 참 쉬운데 구상이 어려운것 같다
근데 이문제는 구상도 쉬웠다
덕분에 오늘 아주 쉽게 경험치 획득~
'백준' 카테고리의 다른 글
[백준 1260] DFS와 BFS(C++) (0) | 2021.11.06 |
---|---|
[백준 11660] 구간 합 구하기 5 (0) | 2021.10.15 |
[백준 17498] 폴짝 게임 (0) | 2021.10.05 |
[백준 1181] 단어 정렬 (0) | 2021.10.04 |
[백준 22983 ] 조각 체스판 (0) | 2021.10.04 |