📕 문제 설명
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
⭐ 제한사항
- 1 ≤ balls ≤ 30
- 1 ≤ share ≤ 30
- 구슬을 고르는 순서는 고려하지 않습니다.
- share ≤ balls
💻 입출력 예
balls | share | result |
3 | 2 | 3 |
5 | 3 | 10 |
📚 입출력 예 설명
입출력 예 #1
- 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.
입출력 예 #2
- 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.
💡 Hint
서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.
😊 나의 답변
function solution(balls, share) {
let n = 1, m = 1, nm = 1;
for(let i = 1; i <= balls; i++) n *= i;
for(let i = 1; i <= share; i++) m *= i;
for(let i = 1; i <= balls - share; i++) nm *= i;
return Math.round(n / (nm * m));
}
처음에 이렇게 풀었다가 효율적이지 못한 것 같아 새로 풀었다.
✨ 재귀함수를 이용해 다시 푼 답변
function solution(balls, share) {
const factorial = (n) => {
if(n === 0 || n === 1) return 1;
return n * factorial(n - 1);
}
const n = factorial(balls);
const m = factorial(share);
const nm = factorial(balls - share);
return Math.round(n / (nm * m));
}
정답 제출 시 틀리는 문제가 발생했는데, 이유는 소수점 숫자 연산에서 오류가 발생했기 때문!
찾아보니 무한소수를 유한소수로 저장하는 과정에서 오차가 발생할 수 있다고 한다.
해결방법
1. toFixed()
메서드 사용 * String으로 반환
2. Math.round()
메서드 사용 * 반올림한 정수 반환
728x90
반응형
'프로그래머스 > Lv. 0 코딩테스트 입문' 카테고리의 다른 글
[프로그래머스] Lv.0 모스부호 (1) / JS (1) | 2023.08.23 |
---|---|
[프로그래머스] Lv.0 가위 바위 보 / JS (0) | 2023.08.23 |
[프로그래머스] Lv.0 점의 위치 구하기 / JS (0) | 2023.08.23 |
[프로그래머스] Lv.0 2차원으로 만들기 / JS (1) | 2023.08.23 |
[프로그래머스] Lv.0 공 던지기 / JS (0) | 2023.08.23 |