Backjoon Online Judge 

"1463번 : 1로 만들기" 문제입니다.


문제 링크 : https://www.acmicpc.net/problem/1463


문제에서 임의의 정수 N에 대해 연산의 최솟값을 구하기 위해 DP를 이용하였습니다. 연산의 경우의 수는 다음 3가지가 존재 합니다.

- 1을 빼기

- 2로 나누기 (나누어 떨어지는 경우)

- 3으로 나누기 (나누어 떨어지는 경우)

 이때 3가지 경우 중 어떤 경우에 연산 경우의 수가 가장 작은지 파악하기 위해 이전값들을 저장합니다. 

 N에서 3가지 연산 결과로 나온 각각의 숫자 중 가장 연산 횟수가 작은 숫자를 만들어내는 연산이 N에 대해 연산을 최소화 할 것입니다.


아래는 코드 설명입니다.

 - 1,000,000이하의 숫자가 주어지므로 배열 크기를 1,000,001로 설정했습니다.

(이 문제의 경우 배열 위치가 해당 숫자가 되고, 그 숫자로 연산하기 때문에 배열 위치랑 숫자랑 맞춰 주었습니다. (연산이 더 간소화됨))

 - 이후 1을 더했을때와 나누기 3을 했을때, 나누기 2를 했을 때 결과를 확인하여 가장 연산이 작아 질 수 있는 숫자를 배열에 저장했습니다.


코드는 C++로 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <algorithm>
 
#define MAX 1000001
 
using namespace std;
 
int main() {
    int N;
    int result[MAX] = { 00 };
    cin >> N;
    for (int i = 2; i <= N; i++) {
        result[i] = result[i - 1+ 1;
        if (i % 3 == 0) {
            result[i] = min(result[i], result[i / 3+ 1);
        }
        else if (i % 2 == 0) {
            result[i] = min(result[i], result[i / 2+ 1);
        }    
    }
    cout << result[N] << endl;
}
 
 

cs


'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글

10844번 : 쉬운 계단 수  (0) 2018.05.13
1005번 : ACM Craft  (0) 2018.05.12
2579번 : 계단 오르기  (0) 2018.05.05
1932번 : 숫자삼각형  (0) 2018.05.01
1149번 : RGB거리  (0) 2018.04.01