

조합으로 해결할 수 있는 문제다.

위와 같은 조합 공식에 따라 팩토리얼을 구현하여 문제를 풀이할 수도 있지만, 단순 계산으로 풀이한다면 계산량이 매우 클 것이다.


따라서 조합의 2가지 성질과 동적 프로그래밍을 활용하여 풀이하였다.
import java.util.Scanner;
public class Main {
static int[][] dp = new int[30][30];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = in.nextInt();
for (int i = 0; i < T; i++) {
int N = in.nextInt();
int M = in.nextInt();
sb.append(combination(M, N)).append('\n');
}
System.out.println(sb);
}
public static int combination(int n, int r) {
// 이미 풀렸을 경우
if (dp[n][r] > 0) {
return dp[n][r];
}
// nC0 = nCn = 1
if (r == 0 || n == r) {
return dp[n][r] = 1;
}
// (n+1, r+1)C = (n, r)C + (n, r+1)C
return dp[n][r] = combination(n - 1, r - 1) + combination(n - 1, r);
}
}
'Algorithm' 카테고리의 다른 글
백준 2579번 계단 오르기 (0) | 2023.03.14 |
---|---|
백준 1003번 피보나치 함수 (1) | 2023.03.14 |
백준 2231번 분해합 (0) | 2023.03.13 |
백준 2798번 블랙잭 (0) | 2023.03.13 |
백준 1436번 영화감독 숌 (0) | 2023.03.11 |
댓글