관리 메뉴

100세까지 코딩

[프로그래머스] Lv0.다음에 올 숫자 본문

코딩테스트/자바

[프로그래머스] Lv0.다음에 올 숫자

100세까지 코딩 2023. 8. 8. 15:11
문제 설명

 

풀기 전 생각
  • 등차수열은 2b = a + c 인 규칙이 있다
  • 등비수열은 a*c = b^2 인 규칙이 있다
  • 다음에 올 숫자는 양변을 이동시키면
    등차수열은 c = 2b - a, 등비수열은 c = b^2 / a이다
class Solution {
    public int solution(int[] common) {
        int answer = 0;
        
        if(2*common[1] == common[0]+common[2]){ // 등차 수열임을 확인
            answer = 2*common[common.length-1] - common[common.length-2]; // c = 2b-a
        }
        if(common[0]*common[2] == (int)Math.pow(common[1],2)){ //등비 수열임을 확인
            answer = (int)Math.pow(common[common.length-1],2) / common[common.length-2]; // c = b^2 / a
        }
        return answer;
    }
}
오류 및 개선
  • 테스트케이스 1개만 계속 런타임 에러가 남
  • Math.pow의 문제인 줄 알고 고쳤지만 동일
  • 런타임 에러가 나타나는 요인 상황 구글링해서 체크
  • {0,0,0}은 등차수열은 괜찮지만 등비수열은 0으로 나누기 때문에  에러 발생
  • {0,0,0}은 등차수열도 되기 때문에 등비수열까지 안 넘어오게 else if로 처리
최종
class Solution {
    public int solution(int[] common) {
        int answer = 0;
        
        if(2*common[1] == common[0]+common[2]){ // 등차 수열임을 확인
            answer = 2*common[common.length-1] - common[common.length-2]; // c = 2b-a
        }
        else if(common[0]*common[2] == (int)Math.pow(common[1],2)){ //등비 수열임을 확인
            answer = (int)Math.pow(common[common.length-1],2) / common[common.length-2]; // c = b^2 / a
        }
        return answer;
    }
}
참고
런타임 에러가 발생하는 경우
1. 배열에 할당된 크기를 넘어서 접근했을 때
2. 전역 배열의 크기가 메모리 제한을 초과할 때
3. 지역 배열의 크기가 스택 크기 제한을 넘어갈 때
4. 0으로 나눌 때
5. 라이브러리에서 예외를 발생시켰을 때
6. 재귀 호출이 너무 깊어질 때
7. 이미 해제된 메모리를 또 참조할 때
8. 프로그램(main 함수)이 0이 아닌 수를 반환했을 때
9. C/C++에서 반환형이 void가 아닌 main이 아닌 함수에서 아무런 값을 반환하지 않았을 때