머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls
와 친구들에게 나누어 줄 구슬 개수 share
이 매개변수로 주어질 때, balls
개의 구슬 중 share
개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
balls
≤ 30share
≤ 30share
≤ balls
balls | share | result |
---|---|---|
3 | 2 | 3 |
5 | 3 | 10 |
입출력 예 #1
입출력 예 #2
※ 공지 - 2022년 10월 11일 제한 사항 및 테스트케이스가 수정되었습니다.
💡 문제풀이 과정
- Hint로 받은 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은
조합
의 공식이다. 공식에서 나오는n!
의!
는팩토리얼(factorial) 기호
로,factorial
이란 수학적 용어로계승
을 의미하며,서로 다른 n개를 나열하는 경우의 수
이다.
n!
= n(n-1)(n-2)(n-3) … 15! (5의 계승)
= 5 4 3 2 1 = 120조합(nCr, Combination)
이란서로 다른 n개 중에 r개를 선택하는 경우의 수
를 의미한다.조합은 뽑는 순서가 중요하지 않다
.순열(nPr, Permutation)
과 비슷하지만,순열의 경우 뽑는 순서가 중요
하다. 순열 또한서로 다른 n개 중에 r개를 선택하는 경우의 수
를 의미한다.
조합(nCr)
= n! / (n-r)! * r!순열(nPr)
= n! / (n-r)!
- 답안 1번:
while()
을 사용하여share가 0이 되기 전
까지 -1을 하여 팩토리얼 공식을 대체하였다. 리턴 부분에서Math.round()
를 한 이유는 테스트의 반례로 결과값이 소수점이 되는 경우가 있어 반올림을 하여 리턴 하였다.- 답안 2번:
재귀함수
를 사용한 다른 사람의 풀이이다.- 답안 3번:
[BIgInt()]
와for()
반복문을 사용하여 공식을 풀이하였다.BigInt
는Number
원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.BigInt
는 정수 리터럴의 뒤에n
을 붙이거나(10n
) 함수BigInt()
를 호출해 생성할 수 있다.BigInt
와Number
는 차이가 있는데,BigInt
는 내장Math
객체의 메서드와 함께 사용할 수 없고, 연산에서Number
와 혼합해 사용할 수 없다. 따라서 먼저 같은 자료형으로 변환해야 한다. 그러나,BigInt
가Number
로 바뀌면 정확성을 잃을 수 있으니 주의해야 한다.
- BIgInt() 관련 출처 및 자세한 내용: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
✅ 답안 #1
function solution3(balls, share) {
let answer = 1;
while (share) {
//share가 0이 되기 전까지
answer *= balls / share;
balls--;
share--;
}
return Math.round(answer);
}
✅ 답안 #2
const 팩토리얼 = (num) => (num === 0 ? 1 : num * 팩토리얼(num - 1));
function solution(balls, share) {
return Math.round(
팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share)
);
}
✅ 답안 #3
function solution(balls, share) {
let factorial = [BigInt(1)];
for (let i = 1; i <= balls; i++) {
factorial[i] = factorial[i - 1] * BigInt(i);
}
return factorial[balls] / (factorial[balls - share] * factorial[share]);
}