개발 블로그
article thumbnail

 

아이디어

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
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!