Post

[LeetCode-1550] 카운트가 3에 도달한 순간 바로 반환하기

[LeetCode-1550] 카운트가 3에 도달한 순간 바로 반환하기
  • 문제 링크: https://leetcode.com/problems/three-consecutive-odds/
  • 파일 경로: src/main/java/coding_test/배열_리스트/LC1550_ThreeConsecutiveOdds.java
  • 난이도: Easy

문제 설명

정수 배열 arr이 주어진다. 홀수가 연속으로 3개 나오는 구간이 있으면 true, 없으면 false를 반환한다.

1
2
Input: arr = [1,2,34,3,4,5,7,23,12]
Output: true  // [5,7,23]이 연속된 홀수 3개

시행착오

앞 문제(485)와 같은 “누적 카운터 + 리셋” 구조를 그대로 가져왔다 — 홀수를 만나면 count를 늘리고, 짝수를 만나면 count를 0으로 리셋.

처음엔 485처럼 최댓값을 추적하는 변수를 따로 만들어야 하나 고민했는데, 곧 이 문제는 “가장 긴 연속 구간이 몇 개인가”가 아니라 “3에 도달하는 순간이 있는가”만 물어본다는 걸 깨달았다. 그래서 count가 3이 되는 순간 바로 true를 반환하도록 바꿨다. 이 덕분에 max 같은 변수를 아예 만들 필요가 없어졌고, 루프가 끝날 때까지 3에 못 도달하면 그냥 false를 반환하면 끝났다.

최종 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public boolean threeConsecutiveOdds(int[] arr) {
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] % 2 == 1) {
            count++;
            if (count == 3) {
                return true;
            }
        } else {
            count = 0;
        }
    }
    return false;
}

오늘 배운 내용

“최댓값이 얼마인가”를 묻는 문제와 “조건을 만족하는 순간이 있는가”를 묻는 문제는 설계가 다르다. 후자는 조건이 충족되는 즉시 반환하면 끝나기 때문에, 최댓값을 추적하는 변수 자체가 필요 없다. 문제를 코드로 옮기기 전에 “이게 최댓값 문제인가, 존재 여부 문제인가”부터 구분하면 불필요한 변수를 하나 줄일 수 있다.

오답노트

이번엔 크게 틀린 지점은 없었다. 대신 485에서 짠 구조를 그대로 재사용하려다가, 문제 성격이 다르다는 걸 알아채고 중간에 설계를 바꾼 과정 자체가 기록할 만하다 — 같은 카운터 패턴이라도 “무엇을 반환해야 하는가”에 따라 최댓값 변수가 필요할 수도, 안 필요할 수도 있다.

This post is licensed under CC BY 4.0 by the author.