구슬을 나누는 경우의 수
https://school.programmers.co.kr/learn/courses/30/lessons/120840
📔 문제 설명
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
💡 입출력 예
balls | share | result |
---|---|---|
3 | 2 | 3 |
5 | 3 | 10 |
💻내가 작성한 코드
- 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;
}
This post is licensed under CC BY 4.0 by the author.