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


1. 문제 이해


n을 입력 받았을때 나누기3, 나누기2, 빼기1 3가지 연산을 사용하여 1로 만들때, 최소 연산수를 구하는 문제 입니다.


2. 접근 방법


다이나믹 프로그램으로 문제 해결을 해보겠습니다. 

이 표현이 맞는지는 모르겠으나, 작은문제에서 큰문제를 해결해 나가는 bottom-up 방식으로 문제를 해결했습니다.


3. 문제 해결


for문으로 완전 탐색을 하되, 크게 3가지로 분류했습니다.


1. 3의 배수인가?                                => 3곱해서 올 수 있고, 1 더해서 올 수 있다.

2. 2의 배수인가?                                => 2곱해서 올 수 있고, 1 더해서 올 수 있다.

3. 3의배수, 2의배수 모두 아닐 경우        => 1더해서 밖에 올 수 없다.


이 루틴을 이용했습니다.


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
#include <cstdio>
#include <algorithm>
#define MAX_SIZE 1000001
 
using namespace std;
 
int dp[MAX_SIZE];
 
int main() {
    int n;
    scanf("%d"&n);
 
    int res = 0;
    dp[1= 0, dp[2= 1, dp[3= 1;
    for (int i = 4; i <= n; i++) {
        if (i % 3 == 0) {
            dp[i] = min(dp[i / 3], dp[i - 1]) + 1;
        }
        else if (i % 2 == 0) {
            dp[i] = min(dp[i / 2], dp[i - 1]) + 1;
        }
        else {
            dp[i] = dp[i - 1+ 1;
        }
    }
    printf("%d\n", dp[n]);
    return 0;
}
cs


'Algorithm > solution' 카테고리의 다른 글

#2140. 지뢰찾기  (0) 2017.12.29
#6305. 로또  (0) 2017.12.26
#10815. 숫자카드  (0) 2017.12.24
#1065. 한수  (0) 2017.12.24
#1654. 랜선자르기  (0) 2017.12.23

+ Recent posts