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

[프로그래머스, LV.0] 다음에 올 숫자

sundori 2024. 12. 15. 20:06

목차

    문제 설명

    등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.


     

    제한사항

    • 2 < common의 길이 < 1,000
    • -1,000 < common의 원소 < 2,000
      • common의 원소는 모두 정수입니다.
    • 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
    • 등비수열인 경우 공비는 0이 아닌 정수입니다.

     

     

    common result
    [1, 2, 3, 4] 5
    [2, 4, 8] 16

     

     

    밑에 코드는 처음 작성한 코드다.

    if (common.length < 2) {
                // 배열에 최소 두 개 이상의 요소가 있어야 함
                throw new IllegalArgumentException("배열에는 최소 두 개 이상의 요소가 필요합니다.");
            }
    
            // 등차수열인지 확인
            int diff = common[1] - common[0]; // 첫 번째 두 항의 차이를 구함
            boolean isArithmetic = true;
            for (int i = 2; i < common.length; i++) {
                if (common[i] - common[i - 1] != diff) { // 연속된 두 항의 차이가 동일하지 않으면
                    isArithmetic = false;
                    break;
                }
            }
    
            if (isArithmetic) {
                // 등차수열일 경우 다음 숫자 반환
                return common[common.length - 1] + diff;
            }
    
            // 등비수열인지 확인
            int ratio = common[1] / common[0]; // 첫 번째 두 항의 비율을 구함
            boolean isGeometric = true;
            for (int i = 2; i < common.length; i++) {
                if (common[i] / common[i - 1] != ratio) { // 연속된 두 항의 비율이 동일하지 않으면
                    isGeometric = false;
                    break;
                }
            }
    
            if (isGeometric) {
                // 등비수열일 경우 다음 숫자 반환
                return common[common.length - 1] * ratio;
            }
    
            // 등차수열도 등비수열도 아닐 경우 예외 발생
            throw new IllegalArgumentException("배열은 등차수열이나 등비수열을 나타내지 않습니다.");

    다음 코드는 좀 더 최적화한 코드이다.

     

    class Solution {
        public int solution(int[] common) {
            // 배열의 길이 확인
            int len = common.length;
    
            // 등차수열인지 확인
            int diff = common[1] - common[0]; // 첫 번째 두 항의 차이를 구함
            if(common[2] - common[1] == diff){
                return common[len - 1] + diff;
            }else{
                return common[len - 1] * common[2] / common[1];
            }
        }
    }

    원래 int ratio = common[1] / common[0]을 사용했지만 common[0]이 0으로 시작하면 런타임 에러가 발생한다.
    따라서 common[2] / common[1]을 직접 넣어준다. 이것도 에러가 발생할 가능성이 있는 코드이긴하다..