관리 메뉴

여름 언덕에서 배운 것

[0단계/6점] 구슬을 나누는 경우의 수 본문

가랑비에 옷 젖는 줄 모른다 💻/🌰코테문풀_꾸준히

[0단계/6점] 구슬을 나누는 경우의 수

잔뜩 2025. 3. 5. 17:57

n개의 구슬중 m개를 뽑는 경우의 수를 구하라 ! 

공식은 다음과 같다.

관건은 팩토리얼을 어떻게 구현할 것인가 !

 

class Solution {
    public int solution(int balls, int share) {
        return combination(balls,share);
    }
    
    private int combination(int balls, int share) {
        int answer = factorial(balls)/(factorial(share)*factorial(balls-share));
    return answer;
    }
    
    private int factorial(int num) {
        int result =1;
        for(int i=1; i<=num; i++){
            result*=i;
        }
    return result;
    }   
}

여기서 문제는 정수 오버플로우ㄱ ㅏ발생했는지 제출하니까 틀린문제가 많았다.

int의 최대값은 2,147,483,647인데, 30!은 훨씬 큰 값이라 long 또는 BigInteger를 써야 함

 

✅ 개선 코드 (BigInteger 사용)

import java.math.BigInteger;

class Solution {
    public BigInteger solution(int balls, int share) {
        return combination(balls, share);
    }

    private BigInteger combination(int balls, int share) {
        return factorial(balls).divide(factorial(share).multiply(factorial(balls - share)));
    }

    private BigInteger factorial(int num) {
        BigInteger result = BigInteger.ONE;
        for (int i = 2; i <= num; i++) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        return result;
    }
}

BigInteger result = BigInteger.ONE; 이게 뭐야? 🤔

이 코드는 BigInteger 타입의 변수 result를 1로 초기화하는 코드

728x90