내 맘대로 공부
article thumbnail

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

 

ex) 입출력 예시

ball share result
3 2 3
5 3 10

Thinking Process

서로 다른 n개 중에서 r개를 선택하는 것, 조합 문제이기 때문에 간단하게 공식으로 해결할 수 있다. 

조합 공식은 아래와 같다 

조합 공식

이 때 팩토리얼은 재귀함수를 이용하면 되겠다라는 생각이 들었다 ( 최근에 팩토리얼을 재귀로 풀어서 ,, )

 

 

Code 

function factorial(num) {
    if(num === 0) {
        return 1
    }
    
    return num * factorial(num-1)
}

function solution(balls, share) {
    // 조합 공식 => n! / (n-r)!r!
    // 재귀 
    let result = factorial(balls) / (factorial((balls-share)) * factorial(share));
    
    return Math.round(result)
}

단순하게 factorial이라는 재귀함수를 하나 만들어주고 조합 공식을 만들어 결과를 return 하도록 하였다. 

 

한 가지 이해하기 어려운 점은 처음 return 문에 Math.round가 아닌 Math.floor를 주었다. 만일 결과 값이 4.2라면 경우의 수는 4인거니까,, 근데 일부 테스트를 통과하지 못해서 Math.round를 썼더니 통과가 안 됐던 것들이 통과되었다. 

 

이에 대해 찾아보니 부동소수점이라는 것이 문제이기 때문에 Math.round를 사용하는 것이 안전하다고 한다.

부동소수점의 문제는 알겠는데,, 만일 값이 4.8이라면 Math.round에 의해 5가 되는 것인데 이게 가능한 경우인가 ?? 

 

부동소수점 참고자료

 

Javascript 소수점 오류 원인, 해결방안

자바스크립트에서 소수점 숫자 연산을 하면, 생각지도 못한 오류가 발생한다. 아래처럼 콘솔창에 0.1 + 0.2를 입력하면, 0.3이 아니라 0.30000000000000004 가 나오는 걸 확인해볼 수 있다. 이렇게 소수점

joooing.tistory.com

 

profile

내 맘대로 공부

@곰도리도리잼

잘못된 정보가 있다면 알려주세요 🧸