1. 문제를 풀면서
백준 온라인 저지에서 푼 문제를 내 블로그에 다루려고 한다. '동적 계획법 기초 단계'의 다섯 번째 문제이다. 동적 계획법을 이런 방식으로 사용하는구나 하고 느낄 수 있다.
2. 문제 출처 및 보기
https://www.acmicpc.net/problem/1463
3. 문제 해결
이 문제도 동적 계획법의 문제이다. 다른 문제와 마찬가지로 이전 문제(작은 문제)의 해결로 현재 문제를 해결하는 방식으로 풀었다. 입력 값이 N이라면 '1 ~ (N-1)'의 해답을 이용해서 풀 수 있다. 해결 방법의 KEY로 주어진 값을 '-1'하거나 '/2', '/3'할 수 있다는 조건이 있다. 그러므로 func(N)은 1 + func(N-1), 1 + func(N/2), 1 + func(N/3) 중 하나일 것이다. (단, func(X)는 X에서 1을 만드는데 계산되는 최소 횟수이다.) 이전에 구한 값을 다시 계산하지 않고 '저장&로드'했다. 이 때 주의할 점은 N은 자연수라는 것이다. 즉 -1, /2, /3 계산한 값이 자연수가 아니면 안된다는 조건을 주어야한다.
4. 소스코드
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 | #include <iostream> #include <algorithm> using namespace std; int dp[1000001]{ 0 }; int main() { int N; // 데이터 입력 scanf("%d", &N); // 문제 해결 dp[1] = 0; for (int n = 2; n <= N; n++) { dp[n] = dp[n - 1] + 1; if (n % 3 == 0) dp[n] = min(dp[n], dp[n / 3] + 1); else if (n % 2 == 0) dp[n] = min(dp[n], dp[n / 2] + 1); } // 결과 출력 printf("%d\n", dp[N]); return 0; } | cs |
'알고리즘 (백준 온라인 저지 공부) > 동적 계획법 기초 단계' 카테고리의 다른 글
4. 백준 2579 계단 오르기 문제 공부 (0) | 2018.01.29 |
---|---|
3. 백준 1932 숫자삼각형 문제 공부 (0) | 2018.01.29 |
2. 백준 1149 RGB거리 문제 공부 (0) | 2018.01.29 |
1. 백준 1003 피보나치 함수 문제 공부 (0) | 2018.01.29 |