코드로 문제 해결 연습 | 다음에 올 숫자

주싱·2022년 12월 21일
0

링크 : 프로그래머스 > Level 0 > 다음에 올 숫자

문제

등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.

소요 시간

20분

문제 해결 코드

enum SequenceType {
    ARITHMETICAL, // 등차수열
    GEOMETRIC     // 등비수열
}

public int solution(int[] sequence) {
    // 주어진 입력이 등차 수열인지, 등비 수열인지 판단합니다.
    SequenceType sequenceType = checkSequenceType(sequence);
    // 등차 또는 등비를 구합니다.
    int regularParam = calculateRegularParam(sequence, sequenceType);
    // 마지막 항목에서 등차 또는 등비를 사용해 해답을 구합니다.
    return getNextNum(sequence[sequence.length - 1], sequenceType, regularParam);
}

private SequenceType checkSequenceType(int[] sequence) {
    assert sequence.length > 2;

    int diff = sequence[1] - sequence[0];
    if (sequence[2] - sequence[1] == diff) {
        return SequenceType.ARITHMETICAL;
    } else {
        return SequenceType.GEOMETRIC;
    }
}

private int calculateRegularParam(int[] sequence, SequenceType type) {
    assert type == SequenceType.ARITHMETICAL || type == SequenceType.GEOMETRIC;
    assert sequence[0] != 0;

    if (type == SequenceType.ARITHMETICAL) {
        return sequence[1] - sequence[0];
    } else {
        return sequence[1] / sequence[0];
    }
}

private int getNextNum(int lastItem, SequenceType type, int regularParam) {
    assert type == SequenceType.ARITHMETICAL || type == SequenceType.GEOMETRIC;

    if (type == SequenceType.ARITHMETICAL) {
        return lastItem + regularParam;
    } else {
        return lastItem * regularParam;
    }
}

개선할점

  • 매우 쉬운 문제에 속하는데 20분이라는 시간을 사용한 것이 아쉽습니다.
  • 처음에 수열의 크기가 2라면 등비수열인지 등차수열인지 판단할 수 없다고 생각해서 혼돈을 겪었습니다. 알고보니 등비수열 입력은 2보다 크다 였습니다. 문제와 제약사항을 빠르게 분명하게 이해하는 것이 중요합니다.

잘한점

  • 문제의 제약사항인 수열은 반드시 등차수열이거나 등비수열이라는 제약을 사용해 문제를 쉽게 해결할 수 있었습니다. 제약 사항등을 assertion 문을 사용해 코드에 명시한 것도 잘한 것 같습니다.
  • 문제 해결 절차를 나누어 각 단계에 집중해서 문제를 해결한 점 잘한 것 같습니다. 다른 사람의 코드를 보면 훨씬 짧은 코드로 문제를 해결하기도 하는데 개인적으로 성능에 문제가 없다면 가독성을 높이기 위해 단계적으로 나누어 해결하는게 더 좋은 것 같습니다.

학습한 것

  • 등비수열은 수열의 각 항목이 일정한 비율로 곱해지며 이어지는 것이고, 등차수열은 수열의 각 항목이 일정한 값으로 더해지며 이어지는 것임을 알았습니다. 등비수열에서 일정한 비율을 등비라고하고 등차수열에서 일정하게 더해지는 값을 등차라고 함을 알게 되었습니다.
profile
소프트웨어 엔지니어, 일상

0개의 댓글