개발일기

[JavaScript] 구슬을 나누는 경우의 수 본문

Algorithm

[JavaScript] 구슬을 나누는 경우의 수

황대성 2024. 7. 18. 19:34
문제 설명

 

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

 

제한사항

 

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

 

서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.

 

입출력 예

 

balls share result
3 2 3
5 3 10

 

풀이
function solution(balls, share) {
  let answer = factorial(balls) / (factorial(balls-share) * factorial(share))
  function factorial (num) {
    let factorial = BigInt(1)
    for(let i = 2; i <= num; i++){
      factorial *= BigInt(i)
    }
    return factorial
  }
  return answer
}

 

풀이 설명

 

이번 문제 풀이는 실패 했다. 입출력 예의 테스트 코드는 성공 했지만, 제출시 실행되는 테스트 코드는 대부분 실패해서 다른 사람의 풀이를 참고 했다. 풀어 보자.

 

1. 힌트를 보면 모든 수가 팩토리얼을 구한 뒤 계산 된다. 그렇기 떄문에 팩토리얼을 계산하는 함수를 만들어 사용한다.

2. factorial 함수는 이렇다. for문으로 반복하는데 i는 2부터 매개변수로 들어오는 num까지 반복한다. 반복하는 값은 factorial이라는 변수에 곱하기 할당 된 후 리턴 한다.

3. 계산된 팩토리얼 값들은 힌트처럼 계산 후 리턴한다.

BigInt란?
BigInt는 자바스크립트에서 정수의 한계를 넘어서는 큰 정수를 다루기 위해 도입된 새로운 데이터 타입이다. Number타입은 64비트 부동 소수점 숫자를 사용하여 정수를 표현하므로, 안전하게 표현할 수 있는 정수의 범위는 약 -2^53에서 2^53-1까지이다. 이 범위를 벗어나는 큰 정수를 정확하게 표현하고 계산하기 위해 BigInt 가 사용된다. factorial 함수 안의 factorial 변수에 할당된 1의 값에 BigInt를 사용한 이유는 타입을 맞춰주기 위함 이다.

 

'Algorithm' 카테고리의 다른 글

[JavaScript] 직사각형 넓이 구하기  (4) 2024.07.24
[JavaScript]삼각형의 완성조건 (2)  (0) 2024.07.19
[JavaScript] 영어가 싫어요  (0) 2024.07.18
[JavaScript] 문자열 계산하기  (0) 2024.07.16
[JavaScript] 컨트롤 제트  (5) 2024.07.15