1 minute read

이항 계수 1

시간 제한 메모리 제한
1 초 256 MB

문제

자연수 N정수 K가 주어졌을 때 이항 계수 (NK)를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N(N) ≤ 10, 0 ≤ K(K) ≤ N(N))

출력

(NK)를 출력한다.

예제 입력 1

5 2

예제 출력 1

10

출처

Idea.

  • 이항계수 ex) 5개에서 2개를 뽑는 경우의 수
  • 4개는 선택이 문제가 해결된 데이터로 가정
    • 마지막 데이터가 선택이 안됐을 경우 → D[4][3]
    • 마지막 데이터가 선택됐을 경우 → D[4][2]
  • 점화식
    • D[5][2] = D[4][3] + D[4][2]
  • DP 배열 초기화
    • 공통적인 경우의 수를 배열에 넣어준다.
    • D[i][1] = i (i개 중 1개를 뽑는 경우의 수는 i개) ex) 5개중 1개를 뽑는 경우의 수 5개
    • D[i][0] = 1 (i개 중 1개도 선택하지 않는 경우의 수는 1개) ex) 5개중 0개를 뽑는 경우의수 1개
    • D[i][i] = 1 (i개 중 i개를 선택하는 경우의 수는 1개) ex) 5개중 5개를 뽑는 경우 1개

Code.

package combination;

import java.util.Scanner;

public class P11050_binomialCoefficient {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt(); // 총 개수
		int K = sc.nextInt(); // 선택의 수

		int[][] DP = new int[N + 1][N + 1];
		for (int i = 0; i <= N; i++) {
			DP[i][i] = 1;
			DP[i][0] = 1;
			DP[i][1] = i;
		}
		
		//점화식 bottom-up
		for (int i = 2; i <= N; i++) { //1은 위에서 모두 채워줌 
			for (int j = 1; j < i; j++) { //고르는 수의 개수가 전체 개수를 넘을 수 없다. 
				DP[i][j] = DP[i-1][j] + DP[i-1][j-1]; 
			}
		}
		System.out.println(DP[N][K]);
	}

}

Leave a comment