JAVA/프로그래머스 코딩테스트 입문

[프로그래머스, LV.0] 구슬을 나누는 경우의

sundori 2024. 12. 12. 05:30

문제 설명

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


 

제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share ≤ balls
balls share result
3 2 3
5 3 10
import java.math.BigInteger;

public class CombinationCalculator {
    /**
     * 조합을 계산하는 메서드
     * nCr = n! / (r! * (n-r)!)
     * @param n 전체 원소의 개수
     * @param r 선택할 원소의 개수
     * @return 조합의 결과를 BigInteger로 반환
     */
    public BigInteger combination(int n, int r) {
        // 조합 공식: n! / (r! * (n-r)!) 계산
        return factorial(n).divide(factorial(r).multiply(factorial(n - r)));
    }

    /**
     * 팩토리얼을 계산하는 메서드
     * @param num 팩토리얼을 계산할 숫자
     * @return 팩토리얼 결과를 BigInteger로 반환
     */
    private BigInteger factorial(int num) {
        BigInteger result = BigInteger.ONE; // 팩토리얼 결과 초기화
        for (int i = 2; i <= num; i++) { // 2부터 num까지 반복
            result = result.multiply(BigInteger.valueOf(i)); // 현재 숫자를 곱함
        }
        return result; // 최종 팩토리얼 값 반환
    }
}

class Solution {
    /**
     * 공의 개수와 나누는 개수를 받아 조합을 계산하는 메서드
     * @param balls 전체 공의 개수
     * @param share 나누는 공의 개수
     * @return 조합의 결과를 int로 반환
     */
    public int solution(int balls, int share) {
        CombinationCalculator calculator = new CombinationCalculator();
        return calculator.combination(balls, share).intValue(); // BigInteger 결과를 int로 변환
    }
}

1. CombinationCalculator 클래스

(1) combination 메서드

  • 역할: nn개의 원소에서 rr개의 원소를 선택하는 조합의 수를 계산한다.
  • 매개변수:
    • n: 전체 원소의 개수
    • r: 선택할 원소의 개수
  • 반환값: 조합 결과를 BigInteger로 반환.
  • 로직:
    1. factorial(n)으로 n!을 계산.
    2. factorial(r)과 factorial(n - r)로 분모를 계산.
    3. 위 값을 나눠 조합 결과를 반환.
  • 공식:

(2) factorial 메서드

  • 역할: 주어진 숫자의 팩토리얼 값을 계산.
  • 매개변수:
    • num: 팩토리얼을 계산할 숫자.
  • 반환값: 계산된 팩토리얼 값을 BigInteger로 반환.
  • 로직:
    1. 팩토리얼 초기값을 1로 설정.
    2. 2부터 num까지 반복하며 곱셈 수행.
    3. 최종 결과를 반환.

2. Solution 클래스

(1) solution 메서드

  • 역할: CombinationCalculator를 이용해 주어진 공의 수와 나눌 공의 수에 대해 조합 값을 계산.
  • 매개변수:
    • balls: 전체 공의 개수 (n).
    • share: 나눌 공의 개수 (r).
  • 반환값: 조합 결과를 int로 반환.
  • 로직:
    1. CombinationCalculator 객체를 생성.
    2. combination 메서드를 호출하여 조합 결과를 얻음.
    3. 결과를 BigInteger에서 int로 변환해 반환.
728x90