본문 바로가기
Algorithm/Programmers

[프로그래머스 JS] 구슬을 나누는 경우의 수 : BigInt()

by 그랴 2022. 11. 17.
더보기

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share  balls

 

조합으로 계산하는 문제였기 때문에 코드는 금방 완성했는데 자꾸 테스트 케이스 3개 정도가 에러가 났다.

function solution(balls, share) {
    let answer = 0;

    function fac(n){
    let f = 1;
    for(let i=2; i <= n; i++){
        f *= i;
    }
    return f;
}
    if ( balls === share){
        answer = 1;
    } else {
        let a = fac(balls);
        let b = fac(balls - share);
        let c = fac(share);
        answer = a / (b*c);
    } 
    
    return answer;
}

 

구글링해보니, BigInt()를 사용해야 한다는 것이었다.

 

BigInt() 는 길이의 제약 없이 정수를 다룰 수 있게 해주는 숫자형이다. 아무래도 팩토리얼을 사용하다보면 큰 숫자를 다루게 되다보니 필요한 듯하다.

https://ko.javascript.info/bigint 

 

BigInt

 

ko.javascript.info

 

BigInt()를 사용하여 수정한 코드는 다음과 같다.

function solution(balls, share) {
    let answer = 0;

    function fac(n){
    let f = BigInt(1);
    for(let i=2; i <= n; i++){
        f *= BigInt(i);
    }
    return f;
}
    if ( balls === share){
        answer = 1;
    } else {
        let a = fac(balls);
        let b = fac(balls - share);
        let c = fac(share);
        answer = a / (b*c);
    } 
    
    return answer;
}