카테고리 없음
[백준] 9084. 동전 / Java
Dev_Green
2023. 6. 21. 10:29
https://www.acmicpc.net/problem/9084
9084번: 동전
우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는
www.acmicpc.net
문제 풀이
주어진 동전들로 목표 금액 M을 만들 수 있는 경우의 수를 찾아내는 문제이다.
일차원 dp 배열을 활용하여 각 금액에 대한 경우의 수를 갱신해나가는 방식으로 풀이할 수 있다.
dp[i] = j 일 때, 금액 i를 만들 수 있는 경우의 수는 j라는 의미이다.
예를 들어, 동전의 종류가 1, 2 세 가지가 있고 목표 금액이 10인 경우를 생각해보자.
먼저 1짜리 동전만 사용하는 경우에 대해 탐색해보자.
1(원) | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
다음은 2짜리 동전도 사용하는 경우를 탐색하는데, 이때 1짜리 동전을 사용했을 때의 결과를 활용한다.
점화식은 dp[i] = dp[i] + dp[i - coin] 이다. 단, i - coin = 0인 경우는 경우의 수가 1이므로 dp[0]의 값을 1로 초기화해준다.
1(원) | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 2 | 3 | 4 | 4 | 5 | 5 | 6 | 6 |
위와 같이 누적으로 각 동전 별로 모든 금액에 대해 탐색해나가면 최종적으로 dp[10] = 6을 답으로 구할 수 있다.
소스 코드
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int N = sc.nextInt();
int[] coins = new int[N];
for (int j = 0; j < N; j++) {
coins[j] = sc.nextInt();
}
int M = sc.nextInt();
System.out.println(solution(N, coins, M));
}
}
static int solution(int N, int[] coins, int M) {
int[] dp = new int[M+1];
dp[0] = 1;
for (int coin : coins) {
for (int i = 1; i <= M; i++) {
if (i >= coin) {
dp[i] = dp[i] + dp[i - coin];
}
}
}
return dp[M];
}
}