아이디어
dp[i] : i 원을 만드는 경우의 수
동전이 1원, 2원, 5원이 있다고 가정하였을 때 단순히 생각해보면
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 5]
다만 이와 같은 계산 방식은 '사용한 동전의 구성이 같은데, 순서만 다른 것'을 다르게 바라보는 방식이므로 약간의 변형이 필요하다.
위와 같은 방식으로 계산하면 3원을 만드는 방법에는
1) 1 + 1 + 1
2) 1 + 2
3) 2 + 1
3가지가 존재하게 되는데 문제에서 요구하는 바에 따르면 2) 와 3)은 같은 경우로 바라봐야 하므로
1) 1 + 1 + 1
2) 1 + 2
만이 계산될 수 있도록 해야한다.
이는 1원짜리 동전으로 i 원을 먼저 만들고 그 후 2원짜리 동전을 추가하여 i 원을 만들 수 있는 경우의 수를 누적하는 방식으로 계산을 하면 가능하다.
dp[i] = dp[i] + dp[i - coin]
ex) 1 ~ 10 원에 대해 1, 2, 5 원으로 계산해보자
dp[1] | dp[2] | dp[3] | dp[4] | dp[5] | dp[6] | dp[7] | dp[8] | dp[9] | dp[10] | |
1원 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2원 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
5원 | 1 | 2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 |
풀이코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _n2293_ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] coins = new int[n];
for (int i = 0; i < n; i++) {
coins[i] = Integer.parseInt(br.readLine());
}
int[] dp = new int[k + 1];
dp[0] = 1;
for (int i = 0; i < n; i++) {
int coin = coins[i];
for (int j = coin; j <= k; j++) {
dp[j] = dp[j] + dp[j - coin];
}
}
System.out.println(dp[k]);
}
}
'Algorithm > 백준 알고리즘' 카테고리의 다른 글
15724번. 주지수 (0) | 2023.10.08 |
---|---|
2294번. 동전 2 (0) | 2023.10.06 |
2138번. 전구와 스위치 (0) | 2023.10.03 |
1025번. 제곱수 찾기 (0) | 2023.10.03 |
20529번. 가장 가까운 세 사람의 심리적 거리 (0) | 2023.06.30 |