[백준] 11051번 - 이항 계수 2 [Java]
[백준] 11051번 - 이항 계수 2 [Java]
문제 풀이
백준 11050번 - 이항 계수 1 해당 문제에서 $N$ 과 $K$ 의 범위가 더 커졌고, 이항 계수를 10,007로 나눈 나머지를 구해야 하는 문제다. 이항 계수는 팩토리얼 연산 때문에 수가 기하급수적으로 커지며 연산량도 많아져서 다이나믹 프로그래밍을 활용해서 효율적으로 구해야 한다.
또한 계산 중간에 기본 타입의 범위를 넘어갈 수 있는데, (a + b) mod M -> ((a mod M) + (b mod M)) mod M이 가능함을 활용해 미리 모듈러 연산으로 수를 작게 유지해줘야 한다.
코드
1. Top-Down dp [Java]
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
30
31
32
33
34
35
import java.io.*;
import java.util.*;
public class Main {
private static final int MOD = 10_007;
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[1 + N][1 + K];
System.out.println(nCr(N, K));
}
private static int nCr(int n, int r) {
if (r == 0 || n == r) return 1;
if (r == 1) return n;
if (dp[n - 1][r] == 0) {
dp[n - 1][r] = nCr(n - 1, r);
}
if (dp[n - 1][r - 1] == 0) {
dp[n - 1][r - 1] = nCr(n - 1, r - 1);
}
return dp[n][r] = (dp[n - 1][r] + dp[n - 1][r - 1]) % MOD;
}
}
2. Bottom-Up dp [Java]
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
import java.io.*;
import java.util.*;
public class Main {
private static final int MOD = 10_007;
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];
for (int n = 0; n <= N; n++) {
dp[n][0] = 1;
for (int r = 1; r <= Math.min(n, K); r++) {
dp[n][r] = (dp[n - 1][r] + dp[n - 1][r - 1]) % MOD;
}
}
System.out.println(dp[N][K]);
}
}
풀이 정보
1. Top-Down dp [Java]
- 7 min
2. Bottom-Up dp [Java]
- 2 min
This post is licensed under CC BY 4.0 by the author.



