πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.2293 동전 1 문제 풀이 - java

πŸ“– 문제

https://www.acmicpc.net/problem/2293

n가지 μ’…λ₯˜μ˜ 동전이 μžˆλ‹€. 각각의 동전이 λ‚˜νƒ€λ‚΄λŠ” κ°€μΉ˜λŠ” λ‹€λ₯΄λ‹€. 이 동전을 μ λ‹Ήνžˆ μ‚¬μš©ν•΄μ„œ, κ·Έ κ°€μΉ˜μ˜ 합이 k원이 λ˜λ„λ‘ ν•˜κ³  μ‹Άλ‹€.

κ·Έ 경우의 수λ₯Ό κ΅¬ν•˜μ‹œμ˜€. 각각의 동전은 λͺ‡ κ°œλΌλ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μ‚¬μš©ν•œ λ™μ „μ˜ ꡬ성이 같은데, μˆœμ„œλ§Œ λ‹€λ₯Έ 것은 같은 κ²½μš°μ΄λ‹€.

πŸ” 접근법

동전 λ¬Έμ œμž…λ‹ˆλ‹€.

동전 λ¬Έμ œλŠ” 그리디 μœ ν˜•μœΌλ‘œλ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ,

이번 동전 1 문제 같은 κ²½μš°μ—λŠ”

μ£Όμ–΄μ§€λŠ” λ™μ „μ˜ κ°€μΉ˜κ°€ 배수 κ΄€κ³„λ‘œ 이뀄지지 μ•Šκ³ 

λͺ¨λ‘ μž„μ˜λ‘œ 주어지기 λ•Œλ¬Έμ— 그리디 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν’€μ΄ν•˜κΈ°μ— μ•Œλ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λŒ€μ‹  동적 ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ 풀이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ™μ „μ˜ κ°œμˆ˜λŠ” λ¬΄ν•œμ •μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹ˆ

각 λ™μ „μœΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό 동적 ν”„λ‘œκ·Έλž˜λ°μ„ 톡해 μ•Œλ§žκ²Œ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

1원뢀터 iμ›κΉŒμ§€ 각 λ™μ „μœΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” κ²½μš°μ— λŒ€ν•œ 점화식은

dp[i] = d[i-coin]+1 μž…λ‹ˆλ‹€.

i원 κΉŒμ§€μ˜ λͺ¨λ“  경우의 수 = (i-coin)원 κΉŒμ§€μ˜ λͺ¨λ“  경우의 수 + 1 μž…λ‹ˆλ‹€.

i-coinμ›μ—μ„œ coin 동전을 더해 i원을 λ§Œλ“€ 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

이λ₯Ό μ΄μš©ν•΄ n개의 λ™μ „μœΌλ‘œ 각각의 동전을 더해 i원을 λ§Œλ“€ 수 μžˆλŠ” 경우λ₯Ό λ”ν•΄λ‚˜κ°€λ©΄ 닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

for (int j = coin[i]; j <= k; j++)

λ˜ν•œ 각 동전에 λŒ€ν•œ λ°˜λ³΅λ¬Έμ„ 선택 된 동전 κ°€μΉ˜λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 쀑볡을 방지 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.dynamic;

import java.io.*;

public class Main_2293 {
    static int n;
    static int k;
    static int dp[];
    static int coin[];
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        solve();
        bw.flush();
        bw.close();
    }
    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input[] = br.readLine().split(" ");
        n = Integer.parseInt(input[0]);
        k = Integer.parseInt(input[1]);
        coin = new int[n];
        dp = new int[k+1];
        for(int i=0; i<n; i++){
            coin[i] = Integer.parseInt(br.readLine());
        }
        br.close();
    }
    public static void solve() {
        dp[0] = 1;
        for (int i = 0; i <n; i++) {
            for (int j = coin[i]; j <= k; j++) {
                dp[j] += dp[j-coin[i]];
            }
        }
        System.out.println(dp[k]);
    }

}

Written on February 15, 2021