olrlobt

[μžλ°”/λ°±μ€€ κ³¨λ“œ5] #2293 동전 1 λ³Έλ¬Έ

Algorithm/λ°±μ€€

[μžλ°”/λ°±μ€€ κ³¨λ“œ5] #2293 동전 1

olrlobt 2023. 1. 10. 00:10

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

πŸ”’ κ³¨λ“œ5 - #2293 λ™μ „ 1

 

πŸ“Œ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ μΆ”κ°€ 힌트

4 10
1
2
5
3

= 20

 

✍️ 풀이법

 

λŒ€ν‘œμ μΈ DP λ¬Έμ œμ΄λ‹€.

 

DP 문제λ₯Ό ν’€ λ•Œ, κ°€μž₯ λ¨Όμ € κ³ λ €ν•΄μ•Ό ν•  것은

캐싱을 ν†΅ν•œ 점화식 λ„μΆœμ΄λ‹€.

 

 

캐싱을 μœ„ν•΄ DP ν…Œμ΄λΈ”μ„ 그렀보면,

κ°€λ‘œμΆ•μ— K원이 되기 μœ„ν•œ κ°€μΉ˜λ₯Ό λ‚˜μ—΄ν•  수 μžˆλ‹€.

 

그리고 μ„Έλ‘œμΆ•μ— 동전을 ν•˜λ‚˜μ”© μΆ”κ°€ν•˜λ©° 문제λ₯Ό ν•΄κ²°ν•΄ 보자.

 

λ¨Όμ € 1μ›μ§œλ¦¬ 동전을  μΆ”κ°€ν•œλ‹€.

1μ›μ§œλ¦¬ λ™μ „μœΌλ‘œ 1원을 λ§Œλ“€λ˜, 2원을 λ§Œλ“€λ˜, 3원을 λ§Œλ“€λ˜... 값은 λͺ¨λ‘ 1이 λ˜λ―€λ‘œ 1둜 μ±„μ›Œμ§€κ²Œ λœλ‹€.

 

λ˜ν•œ, 0원을 λ§Œλ“œλŠ” κ²½μš°λ„ { x } 동전을 μ„ νƒν•˜μ§€ μ•ŠλŠ” 경우 1κ°€μ§€λ‘œ 생각할 수 μžˆλ‹€.

 

 

λ‹€μŒμœΌλ‘œ 2μ›μ§œλ¦¬ 동전을 μΆ”κ°€ν•œλ‹€.

2μ›μ§œλ¦¬ λ™μ „κΉŒμ§€λŠ” μ‰½κ²Œ 직접 μ„Έμ–΄λ³Ό 수 μžˆμœΌλ―€λ‘œ, μ±„μ›Œ 놓고 생각해 보면,

 

2원을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” (2) / (1+1) 두 가지 κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€.

3원을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” (2+1) / (1+1+1) 두 가지 κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€

 

4원을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” (2+2) / (2+1+1) / (1+1+1+1) μ„Έ 가지 κ²½μš°κ°€ μ‘΄μž¬ν•˜κ³ ,

5원을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” (2+2+1) / (2+1+1+1) / (1+1+1+1+1) μ„Έ 가지 κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€.

 

 

1원과 2원 λ™μ „λ§ŒμœΌλ‘œλŠ” 점화식을 μ„Έμš°κΈ° 쉽지 μ•ŠμœΌλ―€λ‘œ λ‹€μŒ 경우λ₯Ό λ³Έλ‹€.

 

λ‹€μŒ 5μ›μ§œλ¦¬ 동전을 μΆ”κ°€ν•΄ 보자.

 

5μ›μ§œλ¦¬ 동전이 κ°œμž…λ˜λŠ” 건, 5원을 λ§Œλ“€ λ•ŒλΆ€ν„° 이닀.

λ”°λΌμ„œ 1~4원을 λ§Œλ“œλŠ” κ°€μ§“μˆ˜λŠ” 이 μ „μ˜ 값을 κ·ΈλŒ€λ‘œ κ°€μ Έμ™€μ„œ μ±„μ›Œ μ€€λ‹€.

 

5원을 λ§Œλ“œλŠ” 경우의 μˆ˜λŠ” 

5μ›μ§œλ¦¬ λ™μ „λ§ŒμœΌλ‘œ λ§Œλ“œλŠ” 경우 (5) ν•œ 가지와

이 μ „κΉŒμ§€μ˜ 동전(1원과 2원) 만으둜 λ§Œλ“œλŠ” 경우  (2+2+1) / (2+1+1+1) / (1+1+1+1+1)  μ„Έ 가지λ₯Ό λ”ν•œ 

4가지이닀.

 

 

이 것은,

5원을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” 경우 + 5원을 ν•˜λ‚˜ 이상 ν¬ν•¨ν•˜λŠ” 경우둜 λ‚˜λˆŒ 수 μžˆλŠ”λ°,

 

5원을 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” 

이 μ „κΉŒμ§€μ˜ 동전(1원과 2원) λ§ŒμœΌλ‘œ λ§Œλ“œλŠ” 경우둜 3가지이고,

 

5원을 ν•˜λ‚˜ 이상 ν¬ν•¨ν•˜λŠ” κ²½μš°λŠ”

ν•˜λ‚˜ 이상 ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ— λ§Œλ“€κ³ μž ν•˜λŠ” λˆμ—μ„œ 5원을 λΉΌ μ€€ 경우의 수

 

즉, λ§Œλ“€κ³ μž ν•˜λŠ” 돈( 5 )μ—μ„œ ν˜„μž¬ λ™μ „μ˜ λ‹¨μœ„ ( 5원 )λ₯Ό λΊ€ ( 0)을 λ§Œλ“œλŠ” 경우이며,

μ•„λž˜ 그림처럼 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

 

5원이 μ€‘λ³΅λΌμ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, 5λ₯Ό λΊ€ 값을 이 μ „ μΊμ‹œκ°€ μ•„λ‹Œ ν˜„μž¬ μΊμ‹œμ—μ„œ μ°Ύμ•„μ•Ό ν•œλ‹€.

 

λ”°λΌμ„œ 3+1=4의 값이 λ‚˜μ˜¨λ‹€.

 

 

 

 

λ§ˆμ°¬κ°€μ§€λ‘œ, 6원을 λ§Œλ“œλŠ” 경우의 μˆ˜λŠ”

 

이 μ „κΉŒμ§€μ˜ 동전  (1원과 2원) 4가지와

5μ›μ§œλ¦¬ 동전을 μ‚¬μš©ν•΄ λ§Œλ“œλŠ” 경우 (5+1) ν•œ 가지.

 

 

즉, 5원이 포함 μ•ˆ 된 경우 4가지와

5μ›μœΌλ‘œ 1원을 λ§Œλ“œλŠ” 경우 1가지λ₯Ό λ”ν•˜λ©΄ λœλ‹€.

 

 

 

λ§ˆμ°¬κ°€μ§€λ‘œ, 

7원 = 4 + 2 = 6

8원 = 5 + 2 = 7

9원 = 5 + 3 = 8

 

 

 

 

λ§ˆμ§€λ§‰ 10μ›μ˜ 경우,

5원을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 6가지 경우의 μˆ˜μ™€

 

5원을 ν•œ 번 이상 μ‚¬μš©ν•˜λŠ” 경우.

즉, 10 - 5 = 5 ( ν•œλ²ˆ μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— 5λ₯Ό λΉΌμ€€λ‹€)

 

5λ₯Ό λ§Œλ“œλŠ” 경우의 수 (이 κ²½μš°μ—λ„ 5κ°€ 포함될 수 μžˆλ‹€. λ”°λΌμ„œ) 4가지

 

6+4=10 이 λœλ‹€.

 

 

 

 

이해가 가지 μ•ŠλŠ”λ‹€λ©΄, ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ μΆ”κ°€ 힌트λ₯Ό 보며 μœ„ 과정을 ν•œ 번 더 μˆ˜ν–‰ν•˜κΈΈ ꢌμž₯ν•œλ‹€.

 

 

 

 

λ”°λΌμ„œ 점화식은

 

이차원 λ°°μ—΄λ‘œλŠ” λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚Ό 수 있고,

dp [ i ][ j ] =  dp [ i-1 ][ j ]  dp [ i ][ j - coin [ i ] ]

 

일차원 λ°°μ—΄λ‘œλŠ” λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

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

 

 

 

 

πŸ—οΈ JAVA 풀이

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class baekjoon2293 {

    static int K;
    static int N;
    static List<Integer> dp = new ArrayList<>();
    static int[] P;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        K = sc.nextInt();
        P = new int[N];
        for (int testCase = 0; testCase < N; testCase++) {
            P[testCase] = sc.nextInt();
        }

        solve();
    }

    public static void solve() {

        dp.add(0);
        for (int i = 0; i < K; i++) {
            dp.add(0);
        }

        dp.set(0,1);
        
        for (int index = 0; index < N; index++) {
            for (int j = P[index]; j <= K; j++) {
                dp.set(j, dp.get(j) + dp.get(j - P[index]));
            }
        }

        System.out.println(dp.get(K));
    }
}

 

 

 

Comments