본문 바로가기

알고리즘

구슬을 나누는 경우의 수 - (프로그래머스 코딩테스트 입문)

문제 설명

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

 

입출력 예

 

https://mathbang.net/111

 

 

입출력 예 설명

 


const factorial = (num) => num === 0 ? 1:num * factorial(num - 1)

function solution(balls, share) {
    var answer = 0;

    answer = Math.round(factorial(balls) / factorial(balls - share) / factorial(share))
    

    
    return answer;
}

 

 

function solution(balls, share) {
    var result = 1;

    let n = 1
    let a = 1
    
   //전체 n개 중에서 a개를 순서없이 뽑는 경우의 수
   //n (n-1) (n -2) 를 a개 만큼 진행한 값(분자) 나누기
   //a (a - 1) (a - 2) 를 a가 1이 될때까지 진행한 값(분모)
    
    for(let i=0; i<share; i++){
        n *= balls-i
        a *= share-i
    }
    
    
    return Math.round(n/a);
}

 

푸는 방식을 몰라 다른 사람들이 푼 방법을 먼저 보고 풀이의 방법을 고민했다.

참고한 블로그 중 가장 도움이 되었던 공식이 아래와 같다.

 

공식
전체 n개 중에서 a개를 순서없이 뽑는 경우의 수
n * (n-1) * (n -2) 를 a개 만큼 진행한 값(분자) 나누기
a * (a - 1) * (a - 2) 를 a가 1이 될때까지 진행한 값(분모)

 

위의 공식을 참고해 경우의 수를 구하는 식을 이해할 수 있었다.

 

 

 

 

 

 

 

🚀 틀린점이 있어 지적할 사항이 있다면, 피드백해주시면 감사하겠습니다. 😊