Algorithm/Baekjoon

합분해 : 2225번 - JAVA

cooper_dev 2020. 7. 13. 21:56

1. 문제 링크

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

 

2225번: 합분해

첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 


2. 문제 설명


3. 문제 접근

-dp문제는 주로 규칙성을 찾고 점화식을 작성하는 것이 핵심이다!!

 

(1) 문제의 규칙성을 확인하기 위해 표를 작성해서 비교!

 

K | N 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 2 3 4 5 6 7 8 9
3 1 3 6 10 15 21 22 30 39
4 1 4 10 20 35 56 78 108 147

 

(2) 표에 표시한 값들의 규칙을 확인해보기

- K = 1일 때, 1을 리턴한다.

- N = 1일 때, 1을 리턴한다.

- 규칙성 : (K,N) = (K-1, N) + (K, N-1) → (2,3) [하단 표에서 (2,2) + (3,1) 확인]

 

K | N 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 2 3 4 5 6 7 8 9
3 1 3 6 10 15 21 22 30 39

 

(3) 규칙성을 통해서 점화식 작성

dp[row][col] = dp[row-1][col] + dp[row][col-1];

 

 


4. 문제 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package dp1;
 
import java.util.Scanner;
 
public class Dividing_Sum {
    static final long div = 1000000000;
    static int[][] dp;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int k = sc.nextInt();
        dp = new int[k+1][n+1];
        
        for (int i = 1; i <= n; i++)    dp[1][i] = 1;
        for (int i = 1; i <= k; i++)    dp[i][0= 1;
        
        for (int row = 1; row <= k; row++) {
            for (int col = 1; col <= n; col++) {
                dp[row][col] = (int) ((dp[row-1][col] + dp[row][col-1]) % div);
            }
        }
 
        System.out.println(dp[k][n]);
        
        sc.close();
    }
}
 
 

 

 

<정답 확인>

 


5. 느낀점 또는 특이사항

- bottom-up 방식으로 문제를 접근 -> top-down으로도 문제 풀이 접근해봐야겠다.