[programmers] 구슬을 나누는 경우의 수 - Java

머쓱이가 갖고 있는 서로 다른 구슬들을 친구들에게 나누어주는 경우의 수를 구하는 문제에서, 구슬의 개수와 나누어줄 구슬의 개수가 매우 클 경우 정수 오버플로우가 발생한다. 이를 해결하기 위해 큰 정수를 처리할 수 있는 BigInteger 클래스를 사용하였다.
Jan 27, 2024
[programmers] 구슬을 나누는 경우의 수 - Java

문제 설명

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 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
입출력 예 #2
  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

Hint

  • 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.
    • notion image

※ 공지 - 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

More articles

See more posts

👨🏻‍💻DriedPollack's Blog