https://www.acmicpc.net/problem/17212
코드설명
동적계획법(DP, Dynamic Programming) 를 활용합니다.
모든 동전을 최소한의 개수를 구하기 위해 완탐을 시도하면, 시간초과가 발생합니다.
이유는, N이 100,000 입니다. 이떄 가능한 모든 경우를 탐색할경우 O(4^n)입니다. 당연히 시간초과가 발생하겠습니다.
그러나, 메모이제이션을 활용할경우 모든 연산이 딱 한번만 진행되게 되기에 시간복잡도가 O(n)으로 변화됩니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
private static int N, K, M;
private static int answer = 0;
private static int[] cache;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
cache = new int[N + 1];
Arrays.fill(cache, -1);
System.out.println(coin(N));
}
private static int coin(int n) {
if(n == 0) return 0;
if(cache[n] != -1) return cache[n];
int ret = (int) 1e5 + 1;
if(n - 1 >= 0) {
ret = coin(n - 1) + 1;
}
if(n - 2 >= 0) {
ret = Math.min(ret, coin(n - 2) + 1);
}
if(n - 5 >= 0) {
ret = Math.min(ret, coin(n - 5) + 1);
}
if(n - 7 >=0) {
ret = Math.min(ret, coin(n - 7) + 1);
}
return cache[n] = ret;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1012 유기농 배추 - BFS(너비우선탐색) JAVA (0) | 2024.08.19 |
---|---|
[백준] 26215 눈 치우기 - 탐욕법(Greedy) + 우선순위큐(PriorityQueue) JAVA (0) | 2024.08.19 |
[백준] 17204 죽음의 게임 - DFS(깊이우선탐색) JAVA (0) | 2024.08.15 |
[백준] 12845 모두의 마블 - 그리디(Greedy, 탐욕법) JAVA (0) | 2024.08.15 |
[백준] 9711 피보나치 - 동적계획법(DP, Dynamic Programming) + 재귀(Recursive) JAVA (0) | 2024.08.14 |