각종 문제들

[프로그래머스] 코딩테스트 입문 - 구슬을 나누는 경우의 수

hunm719 2023. 4. 12. 21:06

문제 출처 : 프로그래머스

 

힌트 내용 덕분에 문제는 쉽게 풀 수 있었다.

class Solution {
    public int solution(int balls, int share) {
        int answer = 0;
        int numerator = 0;
        int denominator = 0;

        numerator = factorial(balls);
        denominator = factorial(balls - share) * factorial(share);
        answer = numerator / denominator;

        return answer;
    }

    private int factorial(int n) {
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result = result * i;
        }
        return result;
    }
}

테스트는 이걸로도 통과할 수 있지만, 해당 코드를 chatgpt에게 물어본 결과,

입력받는 balls 와 share 의 값이 음수일 경우 factorial 함수에서 무한 루프가 발생하여 무한 대기 상태가 될 수 있기 때문에, 이를 방지하기 위해 balls 나 share 값이 음수일 경우 함수의 반환 값을 '-1'로 설정하여 이후 처리에서 오류가 발생할 수 있도록 하는 것이 좋다는 답변을 받았다.

 

 

 

해당 솔루션을 추가한 코드는 아래와 같다.

class Solution {
    public int solution(int balls, int share) {
        if (balls < 0 || share < 0 || balls < share) {
            return -1;
        }
        
        int answer = 0;
        int numerator = 0;
        int denominator = 0;

        numerator = factorial(balls);
        denominator = factorial(balls - share) * factorial(share);
        answer = numerator / denominator;

        return answer;
    }

    private int factorial(int n) {
        if (n < 0) {
            return -1;
        }
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result = result * i;
        }
        return result;
    }
}

 

하지만 테스트를 돌려보니 함정이 있었다.

정확성이 42.9%..? 반 넘게 틀렸다

 

아직 해당 오류의 원인을 찾지 못한 상황이지만, 블로그에 먼저 올려둔다.