TIL27-02 JS 팩토리얼

김태혁·2023년 2월 9일
0

TIL

목록 보기
87/205

문제설명

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

balls share result
3 2 3
5 3 10
    Hint
  • 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.

풀이 과정

  1. 힌트로 주어진 풀이 과정이 있었기 때문에 n!,(n-m)!, m!의 값을 구하고 저 공식에 적용하면 된다고 생각했다.
  2. 그래서 for문을 돌려 오름차순으로 오르면서 숫자를 곱해가는 방법을 선택했다.
function solution(balls, share) {
    let a = 1;
    let b = 1;
    let c = 1;
    let d = balls-share;
    for ( let i =1 ; i <=balls; i++) {
           a = a*i;    // balls에 대한 팩토리얼 계산
    }
    for (let i = 1; i <=share; i++) {
           b= b*i;      // share 에 대한 팩토리얼 계산
    }
    for (let i = 1; i <= d; i++) {
           c= c*i;          //balls-share에 대한 팩토리얼 계산       
    }
return  Math.round(a/(b*c)) // 자바스크립트는 특정수는 소수자리까지 표현된 경우가 있다. 이 때문에 소수점 반올림이 필요하다. 
}
  • 문제점
    • 위의 풀이 과정 자체는 문제가 없었으나 답이 틀리게 나와 찾아보니 JS상에는 특정수의 경우 소수점 자리까지 표현되어 있다. 이 때문에 팩토리얼 계산값이 소수점 자리까지 표현되고, 틀리다고 나왔다.
      밑의 코드가 대표적인 예다.
console.log(29*0.1)// 2.9000000000000004
console.log(14*0.1)//1.4000000000000001
  • 마지막에 소수점 반올림을 해주기 위해 Math.round를 사용해주었고, 정답으로 나왔다.

다른 사람의 풀이

  • 팩토리얼 계산을 재귀함수로 간단히 풀어냈다.
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)

function solution(balls, share) {
  return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}
profile
도전을 즐기는 자

0개의 댓글