2225번: 합분해
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net

문제
두 정수 n과 k를 입력받는다
여기서 n은 만드려고 하는 수, k는 n을 만들기 위해 사용하는 수의 갯수이다.
0부터 n까지 정수 k개를 더해서 합이 n이 되는 경우의 수를 구한다.
만약 입력값이 4 2 라면
1 3
3 1
4 0
0 4
2 2
이렇게 5가지가 된다
문제 풀이
우리가 구하는 경우의 수를 k와 n에 따라 dp에 저장하기 위해 dp[k+1][n+1] 배열을 만들었다.
1. n = 0일때 (만드려는 수가 0)
만드려는 수(n)가 0이면 자릿수(k)가 어떻게 되던지 1가지 방법이 나온다.
(n = 0 , k = 3 이면 0 0 0으로 한가지 n = 0, k = 4면 0 0 0 0으로 한가지)
2. k = 1일때
1개의 숫자 조합으로 n을 만드는 방법은? 본인 숫자를 쓰는 방법 단 하나이다.
3. k = 2일때
두 가지 숫자를 조합하여 숫자를 만들어보자
n=1,k=2
(1,0) (0,1)
dp[2][1] = 2
n=2,k=2
(0,2) (2,0) (1,1)
dp[2][2] = 3
...
n=5,k=2
(5,0) (0,5) (2,3) (3,2) (4,1) (1,4)
dp[2][5] = 5
위에서 구한 숫자를 보기쉽게 표에 적어보면 아래와 같아진다.
n = 0 | n = 1 | n = 2 | n = 3 | n = 4 | n = 5 | n = 6 | |
k = 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
k = 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
k = 3 | 1 | ||||||
k = 4 | 1 |
그리고 k=3일때 n=1을 구해보면 (1,0,0) (0,1,0) (0,0,1) 3가지가 나온다.
n = 0 | n = 1 | n = 2 | n = 3 | n = 4 | n = 5 | n = 6 | |
k = 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
k = 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
k = 3 | 1 | 3 | |||||
k = 4 | 1 |
위 표에서 dp[k][n]를 구하기 위해서 dp[k][n-1] + dp[k-1][n] 점화식이 된다는 것을 볼 수있다
- . dp[k][n] = dp[k][n-1] + dp[k-1][n]
위 점화식으로 전체 표를 채워보면
n = 0 | n = 1 | n = 2 | n = 3 | n = 4 | n = 5 | n = 6 | |
k = 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
k = 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
k = 3 | 1 | 3 | 6 | 10 | 15 | 21 | 28 |
k = 4 | 1 | 4 | 10 | 20 | 35 | 56 | 84 |
예제와 같이 n=6 k=4 일때 84라는 답이 나온다
주의할점
dp에 경우의 수를 넣을때 1,000,000,000 으로 나누어서 넣는 것을 잊지말자...

import java.util.Scanner;
public class B2225 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
// k = 더하는 수의 갯수, n = 만드려는 목표값
int[][] dp = new int[k+1][n+1];
for (int i = 0; i <= n; i++) {
dp[1][i] = 1;
}
for (int i = 2; i <= k; i++) {
dp[i][0] = 1;
for (int j = 1; j <= n; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
dp[i][j] %= 1000000000;
}
}
System.out.println(dp[k][n]);
}
}
'연습문제 > JAVA' 카테고리의 다른 글
[백준] 4179 - 불! (java) (0) | 2022.10.09 |
---|---|
[백준] 9095 - 1,2,3더하기 (java) (0) | 2022.09.20 |
[백준] 13460 - 구슬 탈출2 Re (java) (0) | 2022.09.19 |
[백준] 13460 - 구슬 탈출2 (java) (0) | 2022.09.19 |
[백준] 2294 - 동전 2 (java) (0) | 2022.09.14 |