React

[11050번] 이항 계수 1 binomial coefficient 1

수학, 구현, 211102

문제

자연수 NN과 정수 KK가 주어졌을 때 이항 계수 (KN)(^N_K)를 구하는 프로그램을 작성하시오.

입력

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

출력

(KN)(^N_K)를 출력한다.

예제 입력 1

5 2
Plain Text
복사

예제 출력 1

10
Plain Text
복사

My solution

이항 계수 (rn)(^n_r)는 잘 아는 공식으로 바꾸어 보면 nCr_nC_r을 구하라는 것이다. (여기서는 N, K)
이항 계수라는 용어보다 조합이 익숙해서 무엇인지 찾아보다가 아래의 블로그에서 많은 인사이트를 얻을 수 있었다.
결정적인 것은 이 조건을 가지고 재귀를 만들어 재귀의 탈출 조건을 정해주는 것이다.
첫번째 성질을 보면 왜 1이 되는지 궁금할 수 있다. 흰돌과 검은돌이 각각 한개씩 있는 집합이 3개가 있을 때 이 3개의 집합에서 2개의 흰돌을 뽑는 경우의 수는 결과적으로 다른 한개를 검은 돌로 뽑는 것을 강제하게 된다. 즉, 검은 돌 하나로 뽑는 경우의 수는 2개의 흰돌을 뽑도록 강제하므로 서로 조합의 대칭성에 의해서 같은 경우의 수를 갖게 된다. 이에 따라 첫번째 성질도 (kn)=(nkn)(^n_k) = (^n_{n-k})의 k에 0을 집어 넣은 것과 같다. n개 중에 0개를 뽑는 경우의 수는 1가지, n개 중에 n개를 뽑는 경우의 수도 1가지이다.
두번째 성질은 파스칼 삼각형으로 이해하는 것이 편하다.
아래의 블로그의 설명을 참고했다.(https://blog.naver.com/vollollov/220947452823)
이 같은 성질들로 만들어진 점화식은 다음과 같고 재귀로 구현하면 N이 1~10인 덕에 스택 오버플로우가 발생하지 않고 결과가 잘 나온다.

소스코드

function solution(i) { const input = i.toString().trim().split(" "); [N, K] = input; function binomialCoefficient(n, k) { if (n == k || k == 0) return 1; else return ( binomialCoefficient(n - 1, k - 1) + binomialCoefficient(n - 1, k) ); } console.log(binomialCoefficient(N, K)); return binomialCoefficient(N, K); } test("solution", () => { expect(solution(`5 2`)).toStrictEqual(`10`); });
JavaScript
복사