본문 바로가기

Java/코딩테스트

[java/프로그래머스/120840] 구슬을 나누는 경우의 수 (경우의 수 공식 분할계산, result *= (balls - i), result /= (i+1))

✏️ 문제 설명

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


✏️ code

📌 경우의 수 공식: n! / (n-m)! * m!
balls와 share이 30까지 갈 수 있는 상황에서 30!은 Integer의 범위를 뛰어넘는 큰 수가 됩니다.
따라서 다음과 같이 식을 풀어 분할 계산하였습니다.

📌result *= (balls - i); result /= (i+1);
C(5, 3) = 5! / 3!*2!
            = 5*4*3! / 3!*2*1
            = 5*4 / 2*1
분자는 balls부터 -i까지 곱하고, 분모는 1부터 share까지 나누면 원하는 result를 얻을 수 있습니다.
class Solution {
    public int solution(int balls, int share) {
        if (balls == share) {
            return 1;
        }
        long result = 1;
        for (int i = 0; i < share; i++) {
            result *= (balls - i);
            result /= (i + 1);
        }
        return (int) result;
    }
}
반응형