코딩테스트/JAVA

[JAVA/프로그래머스] 구슬을 나누는 경우의 수

할루솔이 2023. 7. 31. 21:48
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/120840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

제한사항
1 ≤ balls ≤ 30
1 ≤ share ≤ 30
구슬을 고르는 순서는 고려하지 않습니다.
share ≤ balls


입출력 예


입출력 예 설명
입출력 예 #1

서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.

 

입출력 예 #2
서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.


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


class Solution {
    public int solution(int balls, int share) {
        return fac(balls, share);
    }
    
    private int fac(int balls, int share) {
        if (share == 0 || balls == share) {
            return 1;
        } else {
            return fac(balls - 1, share - 1) + fac(balls - 1, share);
        }
    }
}

 

처음에는 1차원적으로 힌트 통해서 코드를 작성했는데 테스트케이스는 통과했지만

나머지 케이스들이 와다다다 오류가 났다.

찾아보니까 재귀함수를 사용해야 통과한다고 하길래 따로 재귀함수를 만들었다.

 

재귀함수는 공식이 따로 있어서 그대로 사용하면 된다!

 

만약, 4! 를 구해야 할 경우에는 

1! = 1

2! = 2x1!

3! = 3x2!

4! = 4x3!

이렇게 호출이 되는데 

 

4! = 4x3!

3!을 구하기 위해서 다시 호출하고

 

3! = 3x2!

2!을 구하기 위해서 또다시 호출하고

호출하고 호출하고 하는 방식이다.

 

 

팩토리얼과 재귀함수에 대한 내용은 따로 정리를 해두어야 할 것 같다.

오늘 코테 풀기 끝~~~!

 

 

 

반응형