728x90

문제

 

 

접근 방식

1원, 2원, 5원 총 3가지의 동전으로 1원부터 10원을 만드는 경우를 적어보면 다음과 같다.

1	1
2	11 2
3	111 12
4	1111 112 22
5	11111 1112 122 5
6	111111 11112 1122 15 222
7	1111111 111112 11122 115 1222 25
8	11111111 1111112 111122 1115 11222 125 2222
9	111111111 11111112 1111122 11115 111222 1125 12222 225
10	1111111111 111111112 11111122 111115 1111222 11125 112222 1225 22222 55

 

다시 1원만 사용한 경우, 1원과 2원을 사용한 경우, 세 가지 동전을 모두 사용한 경우로

경우의 수가 몇 개인지 정리해보면 다음과 같다. (0번 인덱스는 1이다.)

  1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1 1
1,2 1 2 2 3 3 4 4 5 5 6
1,2,5 1 2 2 3 4 5 6 7 8 10

 

1원 동전으로는 값만큼 동전을 사용하면 모든 값을 만들 수 있기 때문에 모두 한 가지일 것이니 넘어가고

2원까지 추가로 사용해 n원을 만드는 경우를 먼저 생각해보겠다.

 

2원을 사용해서 2원 미만의 값은 당연히 만들 수 없으니

미만의 값들은 이전의 값을 그대로 사용하고 넘어가면 되고

2원 이상부터는 2원 동전을 사용할 수 있으니 값이 달라질 것이다.

 

위의 표에서 1원과 2원을 사용해 2원을 만드는 경우를 살펴보면

(1원으로 2를 만드는 경우인 1) + (2원으로 2 - 2원을 만드는 경우인 1) = 2가 되고

10원을 만드는 경우를 살펴보면

(1원으로 10원을 만드는 경우인 1 + 2원으로 (10 - 2)원을 만드는 경우인 5 = 6이 된다

 

이제 5원 동전까지 사용하는 경우도 마찬가지로

5원 이상부터 테이블의 값을 변경해주면 되고

10원을 만드는 경우를 살펴보면

(1원과 2원으로 10원을 만드는 경우인 6) + (5원으로 10 - 5원을 만드는 경우인 4) = 10이 된다.

 

점화식으로 정리하면 다음과 같다. (i는 목표가치, j는 현재 동전의 가치)

dp[i] = dp[i] + dp[i-j]

 

이때 dp[0] = 1로 초기화 해주어야

동전의 가치가 K인 경우를 처리할 수 있고

동전의 가치 이상의 dp 테이블을 수정할 때 처음에 dp[0]을 호출할 일이 있기 때문에

이를 0인 초기값으로 냅둬두면 테이블의 값이 변하지 않는다.

 

 

풀이

public class Main {

	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[] dp = new int[k + 1];

		dp[0] = 0;

		for (int i = 0; i < n; i++) {
			int coin = Integer.parseInt(br.readLine());

			for (int j = coin; j <= k; j++) {
				dp[j] += dp[j - coin];
			}
		}

		System.out.println(dp[k]);
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 9657번 : 돌 게임 3  (1) 2024.03.13
[백준] 4883번 : 삼각 그래프  (4) 2024.03.11
[백준] 11052번 : 카드 구매하기  (0) 2024.03.08
[백준] 2156번 : 포도주 시식  (0) 2024.03.08
[백준] 1904번 : 01타일  (0) 2024.03.07

+ Recent posts