1 λΆ„ μ†Œμš”

πŸ“ [S2_9184] μ‹ λ‚˜λŠ” ν•¨μˆ˜ μ‹€ν–‰

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static StringTokenizer st;
    static int[][][] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        dp = new int[21][21][21];

        while(true){
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            if(a == -1 && b == -1 && c == -1){
                break;
            }

            sb.append("w(").append(a).append(", ").append(b).append(", ").append(c).append(") = ").append(w(a,b,c)).append("\n");

        }
        System.out.print(sb);

    }

    static int w(int a,int b,int c){

        // 이미 μ €μž₯λ˜μžˆλŠ” 경우, λ²”μœ„μ•ˆμ— μžˆμ„ 경우 λ°”λ‘œ λ°˜ν™˜
        if(check(a,b,c) && dp[a][b][c] != 0){
            return dp[a][b][c];
        }

        // μž¬κ·€μ‹ λ©”λͺ¨λ¦¬μ œμ΄μ…˜
        if(a <= 0 || b <=0 || c <= 0){
            return 1;
        }
        else if(a > 20 || b > 20 || c >20){
            return dp[20][20][20] = w(20,20,20);
        }
        else if(b > a && c > b){
            return dp[a][b][c] = w(a,b,c-1) + w(a, b-1, c-1) - w(a, b-1 ,c);
        }
        else{
            return dp[a][b][c] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1);
        }
    }

    // λ²”μœ„μ•ˆμ— μžˆλŠ”μ§€ 확인
    static boolean check(int a, int b, int c){
        return a >=0 && a<=20 && b>=0 && b<=20 && c>=0 && c<=20;
    }
}

πŸ€” λ‚˜μ˜ 생각

DP λ¬Έμ œμ΄λ‹€.
기본적으둜 μž¬κ·€ ν•¨μˆ˜μ˜ κ΅¬μ‘°λŠ” λ‚˜μ™€μžˆκΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬μ œμ΄μ…˜λ§Œ ν•΄μ£Όλ©΄ λœλ‹€.
κ·ΈλŸ¬λ‚˜ ν•œ 가지 더 ν•΄μ•Όν•  것이 μžˆμ—ˆλ‹€. λ°”λ‘œ λ²”μœ„ 섀정이닀.
a,b,c, 쀑 ν•˜λ‚˜λΌλ„ 20을 λ„˜μœΌλ©΄ κ·Έλƒ₯ μž¬κ·€ν•¨μˆ˜ w(20,20,20)을 뢈러였기 λ•Œλ¬Έμ—
λ²”μœ„ μ•ˆμ— μžˆκ±°λ‚˜ 이미 λ©”λͺ¨λ¦¬μ œμ΄μ…˜ λ˜μ–΄ μžˆλŠ” 것은 λ°”λ‘œ ν˜ΈμΆœμ„ ν•΄μ£Όκ³ 
μ•„λ‹Œ 것듀은 계속 λ©”λͺ¨λ¦¬μ œμ΄μ…˜ ν•΄κ°€λŠ” 과정을 κ±°μΉœλ‹€.