https://www.acmicpc.net/problem/2225
1. 아이디어
Bottom-Up 다이나믹 프로그래밍 또는 중복조합을 활용한 Top-Down 다이나믹 프로그래밍으로 해결할 수 있다.
2. 문제풀이
0부터 N까지의 수 중 K개를 선택해서 N을 만드는 경우는 중복조합으로 해결할 수 있다.
N을 0 + 1 + 1 + ... + 1 + 0 으로 표현한다면 덧셈 기호는 N+1개가 되고 이 덧셈 기호 중 K-1개를 선택해서 칸막이를 치면 K개의 덩어리를 얻을 수 있다. 이 각 덩어리의 합이 선택한 숫자라고 생각하면 중복조합으로 해결하는 아이디어를 얻을 수 있다.
중복조합 공식 중 nHr = n-1Hr + nHr-1을 이용해서 다이나믹 프로그래밍으로 풀이했다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
private static final int MOD = 1_000_000_000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[][] dp = new int[1 + N][1 + K];
Arrays.fill(dp[0], 1);
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
}
System.out.println(dp[N][K]);
}
}
import java.io.*;
import java.util.*;
public class Main {
private static final int MOD = 1_000_000_000;
private static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
dp = new int[2 + N][K];
System.out.println(recur(N + 1, K - 1));
}
private static int recur(int N, int K) {
if (N == 0) return 0;
if (K == 0) return dp[N][K] = 1;
if (dp[N][K] != 0) return dp[N][K];
return dp[N][K] = (recur(N - 1, K) + recur(N, K - 1)) % MOD;
}
}
4. 후기
- Bottom-Up
- Top-Down
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 15552번 - 빠른 A+B [Java] (0) | 2025.01.05 |
---|---|
[백준] 9713번 - Sum of Odd Sequence [Java] (1) | 2025.01.05 |
[백준] 16165번 - 걸그룹 마스터 준석이 [Java] (1) | 2025.01.04 |
[백준] 17219번 - 비밀번호 찾기 [Java] (0) | 2025.01.04 |
[백준] 1620번 - 나는야 포켓몬 마스터 이다솜 [Java] (0) | 2025.01.04 |