반응형
코드를 보기 전에: 이 문제도 DP문제다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
이렇게 연산을 계속해서 1을 만들어야한다.
우선은 반복문을 만들어준다.
반복문 첫 문장이 dq[i]의 값이 전 값에서 1을 더한 것이므로 반복문은 2부터 시작한다.
1
2
|
for (int i = 2; i <= num; i++)
dp[i] = dp[i - 1] + 1;
|
cs |
배열에서 dp[i -1]인덱스에서 1을 더 한값과 i를 2로 나눈 숫자가 저장된 값을 비교해서 더 작은값을 고른다.
1
2
3
4
|
if (i % 2 == 0)
{
dp[i] = (MIN(dp[i], dp[i / 2] + 1));
}
|
cs |
배열에서 dp[i-1]인덱스에서 1을 더한 값과 i를 3로 나눈 숫자가 저장된 값을 비교해서 더 작은 값을 고른다.
1
2
3
4
|
if (i % 3 == 0)
{
dp[i] = (MIN(dp[i], dp[i / 3] + 1));
}
|
cs |
Fullcode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
#define MIN(a,b) a<b?a:b
int dp[1000001];
int main()
{
int num;
scanf("%d", &num);
for (int i = 2; i <= num; i++)
{
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0)
{
dp[i] = (MIN(dp[i], dp[i / 2] + 1));
}
if (i % 3 == 0)
{
dp[i] = (MIN(dp[i], dp[i / 3] + 1));
}
}
printf("%d", dp[num]);
}
|
cs |
반응형