Post

구슬을 나누는 경우의 수

https://school.programmers.co.kr/learn/courses/30/lessons/120840

📔 문제 설명

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

💡 입출력 예

ballsshareresult
323
5310

💻내가 작성한 코드

  • balls * balls - 1 * balls -2 …
  • 반복하는 팩토리얼 함수 만들기
  • 힌트를 참고해서 최종값 구하기
    • factorial(balls) / (factorial((balls-share)) * factorial(share))

※ 8개가 오류가 계속 나서 다른사람들의 풀이를 찾아보니, BigInt()를 형식을 사용해야 balls 와 share의 범위를 감당할 수 있다는 것을 알게됨

1
2
3
4
5
6
7
8
9
10
11
function solution(balls, share) {
  return factorial(balls) / (factorial(balls - share) * factorial(share));
}

function factorial(num) {
  let result = BigInt(1);
  for (let i = num; i >= 2; i--) {
    result *= BigInt(i);
  }
  return result;
}

💻다른 사람 코드 1

  • BigInt() 사용해서 길이 제약 없이 정수를 다루기
1
2
3
4
5
6
7
8
function solution(balls, share) {
  const [n, m] = [balls, share];
  const fact = [BigInt(1), BigInt(1)];

  for (let i = 2; i = n; i++) fact[i] = fact[i - 1] * BigInt(i);

  return Number(fact[n] / (fact[n - m] * fact[m]));
}

💻다른 사람 코드 2

  • Math.round()를 사용해 정수로 만들기
1
2
3
4
5
6
7
8
9
10
function solution(balls, share) {
    function fac(n){
        var i = 1;
        for(var j = 2; j = n; j++) i*= j;
        return i;
    }
    var answer = Math.round(fac(balls) / (fac(balls-share) * fac(share)));

    return answer;
}

https://ko.javascript.info/bigint

This post is licensed under CC BY 4.0 by the author.