[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입니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fgrepp-programmers.s3.ap-northeast-2.amazonaws.com%252Ffiles%252Fproduction%252F668adf7a-38b1-4112-bbc5-4fab429168c9%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA%2525202022-08-01%252520%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE%2525204.15.55.png%3Ftable%3Dblock%26id%3D9484893b-633a-4a91-b2cd-a6411cd544bc%26cache%3Dv2&w=3840&q=75&dpl=dpl_HnobkVJ8Ls7dr9n2cBQPYtJBT3RJ)
입출력 예 #2
- 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.
Hint
- 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fgrepp-programmers.s3.ap-northeast-2.amazonaws.com%252Ffiles%252Fproduction%252F54c8b2b9-f88c-4a09-8956-7560ff7ea918%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA%2525202022-08-01%252520%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE%2525204.37.53.png%3Ftable%3Dblock%26id%3D82fba692-ad23-4343-8fda-925e6f6235a6%26cache%3Dv2&w=3840&q=75&dpl=dpl_HnobkVJ8Ls7dr9n2cBQPYtJBT3RJ)
※ 공지 - 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