다음과 같은 방법으로 풀려고 했는데 테스트 케이스 2, 3, 6번을 통과하지 못했다.
풀이 방법이 틀린 것은 아니었는데, 코드를 잘못 짠 부분이 있었다.
왜 잘못된 것인지는 밑에 소스 코드와 함께 설명하겠다.
1. 등비 수열 여부 판단 - boolean
2. 등비 수열일 경우, 마지막 원소 * 공비
3. 아닐 경우, 마지막 원소 - 공차
기존 방법 절차 1번에서 등비 -> 등차 수열 여부 판단으로 수정하였다.
코드는 밑에서부터 위로 작성하였다.
기존에는 solution 안에 코드를 한꺼번에 작성했는데,
좀 더 보기 좋게 코드를 작성하려고 메서드를 분리했더니 예상치 못한 오류가 생기기도 했다.
class Solution {
public int solution(int[] common) {
return calculate(common);
}
private int calculate(int[] common) {
if (isRatio(common)) { // 등비 수열일 경우
return (int) (common[common.length - 1] * ratio(common));
}
return common[common.length - 1] + sequence(common);
}
private int sequence(int[] common) { // 공차 계산
return common[1] - common[0];
}
// 주의: 리턴 타입 double
private double ratio(int[] common) { // 공비 계산
return (double) common[1] / common[0];
}
private boolean isRatio(int[] common) { // 등비 수열 여부 판단
return common[1] / common[0] == common[2] / common[1];
}
}
class Solution {
public int solution(int[] common) {
return calculate(common);
}
private int calculate(int[] common) {
if (isSequence(common)) {
return common[common.length - 1] + sequence(common);
}
return (int) (common[common.length - 1] * ratio(common));
}
private int sequence(int[] common) {
return common[1] - common[0];
}
private double ratio(int[] common) {
return (double) common[1] / common[0];
}
private boolean isSequence(int[] common) { // 등비 수열 확인 -> 등차 수열 확인하는 것으로 변경
return common[1] - common[0] == common[2] - common[1];
}
}
공비를 계산하는 ratio() 메서드를 최초 int 타입으로 작성
공비가 소수점이 있는 실수일 경우 0으로 계산되어 발생
등비 수열 여부를 판단하는 isRatio() 메서드에서 런타임 오류 발생
0으로 나뉠 경우를 고려하지 못하여 오류 발생
ArithmeticException 발생나누셈할 때 0을 조심하자!