100세까지 코딩
[프로그래머스] Lv0.다음에 올 숫자 본문
문제 설명
풀기 전 생각
- 등차수열은 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이 아닌 함수에서 아무런 값을 반환하지 않았을 때
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.연속된 수의 합 (0) | 2023.08.13 |
---|---|
[프로그래머스] Lv0.분수의 덧셈 (0) | 2023.08.13 |
[프로그래머스] Lv0.겹치는 선분의 길이 (0) | 2023.08.12 |
[프로그래머스] Lv0.평행 (0) | 2023.08.09 |
[프로그래머스] Lv0.옹알이 (0) | 2023.08.08 |