[programmers] 구슬을 나누는 경우의 수 - Java
머쓱이가 갖고 있는 서로 다른 구슬들을 친구들에게 나누어주는 경우의 수를 구하는 문제에서, 구슬의 개수와 나누어줄 구슬의 개수가 매우 클 경우 정수 오버플로우가 발생한다. 이를 해결하기 위해 큰 정수를 처리할 수 있는 BigInteger 클래스를 사용하였다.
Jan 27, 2024
문제 설명
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수
balls
와 친구들에게 나누어 줄 구슬 개수 share
이 매개변수로 주어질 때, balls
개의 구슬 중 share
개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.제한사항
- 1 ≤
balls
≤ 30
- 1 ≤
share
≤ 30
- 구슬을 고르는 순서는 고려하지 않습니다.
share
≤balls
입출력 예
balls | share | result |
3 | 2 | 3 |
5 | 3 | 10 |
입출력 예 설명
입출력 예 #1
- 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.
입출력 예 #2
- 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.
Hint
- 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.
※ 공지 - 2022년 10월 11일 제한 사항 및 테스트케이스가 수정되었습니다.
solution.java
import java.math.BigInteger; class Solution { public int solution(int balls, int share) { BigInteger numerator = BigInteger.ONE; BigInteger denominator1 = BigInteger.ONE; BigInteger denominator2 = BigInteger.ONE; for (int i = 1; i <= balls; i++) { numerator = numerator.multiply(BigInteger.valueOf(i)); } for (int i = 1; i <= balls - share; i++) { denominator1 = denominator1.multiply(BigInteger.valueOf(i)); } for (int i = 1; i <= share; i++) { denominator2 = denominator2.multiply(BigInteger.valueOf(i)); } BigInteger result = numerator.divide(denominator1.multiply(denominator2)); return result.intValue(); } }
핵심 키워드
- 처음 해당 문제를 접근했던 방식은 int 값으로 분자와 분모를 선언하는 것이었다.
- 하지만 이 경우 작은 수의 계산은 가능했으나특히 변수의 값이 클 경우 정수 오버플로우로 인해 문제가 발생했다. 계승값이 매우 커져버리면 계산이 int 자료형의 용량을 초과했던 것이다.
- 따라서 이 문제를 해결하기 위해 큰 정수를 처리할 수 있는 BigInteger 클래스를 사용했다.
결론!
해당 문제를 풀면서 코드를 작성하다가 정수 오버플로우가 발생했고, 이를 BigInteger 클래스를 사용함으로서 해결할 수 있었다.
Share article