백준 2225 - 합분해

Updated:

Java

2225 번 - 합분해

문제

접근 방법

0부터 n까지의 정수를 K개 사용하여 정수 N을 만든다고 가정하면 점화식은 다음과 같이 생각 할 수 있다.

정수 K - 1개로 정수 N을 만든 경우의 수가 a개 있다면, 여기서 0을 추가하여 K개의 정수로 N을 만드는 경우의 수가 a가 된다.
K - 1개로 정수 N - 1을 만든 경우의 수가 b개 있다면, 여기서 1을 추가하여 K개의 정수로 N을 만드는 경우의 수가 b가 된다.
K - 1개로 정수 N - 2을 만든 경우의 수가 c개 있다면, 여기서 2을 추가하여 K개의 정수로 N을 만드는 경우의 수가 c가 된다.
… K - 1개로 정수 0을 만든 경우의 수가 z개 있다면, 여기서 n을 추가하여 K개의 정수로 N을 만드는 경우의 수가 z가 된다.

위 경우를 다 합하면 K 개로 N을 만드는 경우의 수는 a + b + c + d + … + z 개가 된다.

즉, k-1개의 정수로 N을 만드는 경우의 수를 모두 합한것이, k 개의 정수로 N을 만드는 경우의 수이다.

따라서 점화식은 다음과 같다.

dp[k][n] = dp[k][n - 1] + dp[k - 1][n - 1]

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result, k;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	k = stoi(stk.nextToken());
    	int[][] dp = new int[k][n + 2];

    	Arrays.fill(dp[0], 1);
		// N을 만들기 위한 정수의 개수
    	for(int i = 1; i < k; i++) {
			// 정수 i개를 써서 j를 만드는 총 경우의 수
    		for(int j = 1; j < n + 2; j++) {
    			dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 1000000000;
    		}
    	}

    	System.out.println(dp[k - 1][n + 1]);
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}