[프로그래머스] 다음에 올 숫자 - JAVA(자바)

Jinny·2023년 2월 15일
0

프로그래머스-Java

목록 보기
1/2

🔍 1. 문제

다음에 올 숫자

🧑🏻‍💻 2. 풀이 방법

다음과 같은 방법으로 풀려고 했는데 테스트 케이스 2, 3, 6번을 통과하지 못했다.
풀이 방법이 틀린 것은 아니었는데, 코드를 잘못 짠 부분이 있었다.
왜 잘못된 것인지는 밑에 소스 코드와 함께 설명하겠다.

기존

1. 등비 수열 여부 판단 - boolean
2. 등비 수열일 경우, 마지막 원소 * 공비
3. 아닐 경우, 마지막 원소 - 공차

수정 후

기존 방법 절차 1번에서 등비 -> 등차 수열 여부 판단으로 수정하였다.

  1. 등비 등차 수열 여부 판단 - boolean
  2. 등비 수열일 경우, 마지막 원소 * 공비
  3. 아닐 경우, 마지막 원소 - 공차

🖥 3. 소스 코드

기존

코드는 밑에서부터 위로 작성하였다.

기존에는 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];
    }
}

💡 4. 오답 노트

오류 발생 원인1

상황

공비를 계산하는 ratio() 메서드를 최초 int 타입으로 작성

원인

공비가 소수점이 있는 실수일 경우 0으로 계산되어 발생

테스트 케이스

  • 입력: [-16, -8, -4]
  • 출력: 0 (-2가 정답)

오류 발생 원인2

상황

등비 수열 여부를 판단하는 isRatio() 메서드에서 런타임 오류 발생

원인

0으로 나뉠 경우를 고려하지 못하여 오류 발생

테스트 케이스

  • 입력: [0, 2, 4]
  • 출력: ArithmeticException 발생

✔️ 5. 한 줄 정리

나누셈할 때 0을 조심하자!

profile
블로그 이사갔어요. https://jinny-l.tistory.com/

0개의 댓글