[문제 링크]
https://www.acmicpc.net/problem/14916
[난이도]
- Silver 5
[알고리즘]
- DP
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[100001];
dp[0] = INF;
dp[1] = INF;
dp[2] = 1;
dp[3] = INF;
dp[4] = 2;
dp[5] = 1;
for (int i = 6; i <= n; i++) {
dp[i] = Math.min(dp[i - 2], dp[i - 5]) + 1;
}
System.out.println(dp[n] == INF ? -1 : dp[n]);
}
}
[풀이]
DP로 문제를 풀어보았다. Bottom-up방식으로 풀었다.
1. 문제를 하위문제로 쪼갠다
dp[1] = 동전을 못거슬러줌
dp[2] = 2원짜리 하나 거슬러줌
dp[3] = 2원짜리 하나 거슬러줘도, 남은1원을 못거슬러줌
dp[4] = 2원짜리로 2개
dp[5] = 5원짜리 하나
dp[6] = 5원짜리 하나, 남은 1원못거슬러줌
2원짜리 3개거슬러줌
2. 관계를 수식화
5원을 거슬러줄때랑 2원을 거슬러줄때랑을 둘 다 고려해야함
dp[n] = Math.min(dp[n-2], dp[n-5]) + 1
3. 초기값 설정
dp[0] = INF
dp[1] = INF
dp[2] = 1
dp[3] = INF
dp[4] = 2
dp[5] = 1
[출처]
'코딩테스트' 카테고리의 다른 글
백준 10826: 피보나치 수 4[JAVA] (0) | 2024.05.30 |
---|---|
백준 9625: BABBA[JAVA] (0) | 2024.05.30 |
백준 9655: 돌 게임 [JAVA] (0) | 2024.05.30 |
백준 1010: 다리 놓기 [JAVA] (0) | 2024.05.29 |
백준 19637: IF문 좀 대신 써줘 [JAVA] (0) | 2024.05.24 |