[LeetCode-674] nums[i-1] 대신 직전 값을 변수로 기억하기
[LeetCode-674] nums[i-1] 대신 직전 값을 변수로 기억하기
- 문제 링크: https://leetcode.com/problems/longest-continuous-increasing-subsequence/
- 파일 경로:
src/main/java/coding_test/배열_리스트/LC0674_LongestContinuousIncreasingSubsequence.java - 난이도: Easy
문제 설명
정렬되지 않은 정수 배열 nums가 주어진다. 값이 계속 커지는(엄격히 증가하는) 연속 구간 중 가장 긴 것의 길이를 반환한다.
1
2
Input: nums = [1,3,5,4,7]
Output: 3 // [1,3,5]
시행착오
앞 두 문제(485, 1550)와 같은 “누적 카운터 + 끊기면 리셋 + 최댓값 갱신” 구조의 변형이다. 다만 여기서는 인접한 두 원소를 비교해야 해서, nums[i-1]을 직접 참조하는 대신 current라는 변수에 직전 값을 저장해두고 그걸 nums[i]와 비교하는 방식을 선택했다.
증가 중이면 raise를 늘리고, 아니면 max를 갱신한 뒤 raise를 1로 리셋한다. 초안에서 이 두 갈래(증가/비증가) 코드에 비슷한 줄이 중복돼 있는 걸 다 쓰고 나서 스스로 알아채고 정리했다.
485에서 배운 “루프 종료 후 남은 구간 처리”가 자동으로 떠올라서, 루프가 끝난 뒤에도 max = Math.max(max, raise);를 한 번 더 넣어서 배열이 증가로 끝나는 경우를 놓치지 않게 했다.
최종 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int findLengthOfLCIS(int[] nums) {
int raise = 1;
int max = 1;
int current = nums[0];
for (int i = 1; i < nums.length; i++) {
if (current < nums[i]) {
raise++;
} else {
max = Math.max(raise, max);
raise = 1;
}
current = nums[i];
}
max = Math.max(max, raise);
return max;
}
오늘 배운 내용
인접한 값을 비교할 때 nums[i-1]로 직접 인덱싱하는 것과, 별도 변수에 직전 값을 “기억”해두는 것 두 방식이 있는데, 이번엔 후자를 골랐다. 그리고 485에서 다진 “루프 종료 후 남은 구간 처리” 패턴이 이 문제에서도 그대로 재사용됐다 — 같은 실수를 미리 막았다는 뜻이라, 패턴이 손에 붙기 시작한 신호로 본다.
오답노트
- 틀렸던 패턴: 처음 초안에서 증가/비증가 두 분기에 비슷한 코드가 중복돼 있었음.
- 왜 틀렸나: 두 분기를 따로 생각하며 짜다 보니, 공통으로 필요한 처리(
current갱신 등)가 양쪽에 겹쳐 들어갔다. - 고친 패턴: 두 분기가 공유하는 부분(
current = nums[i];)을if/else바깥으로 빼서 한 번만 실행되게 정리했다. - 다음에 떠올릴 시점:
if/else양쪽에 똑같은 줄이 보이면, 그 줄이 조건과 무관하게 항상 실행돼야 하는 코드인지부터 의심한다.
This post is licensed under CC BY 4.0 by the author.