다음과 같은 방법으로 풀려고 했는데 테스트 케이스 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을 조심하자!