128. Longest Consecutive Sequence

2025. 10. 21. 22:14·Coding Test/LeetCode

난이도: 중간 (Medium)

링크: LeetCode 128

풀이 날짜: 2025/10/22

 

1. 문제 이해

정수 배열 nums가 주어질 때, 연속된 정수로 이루어진 가장 긴 시퀀스 길이를 구하는 문제이다. 그리고 연속된 수들은 배열 내에서 순서대로 나열되어 있을 필요는 없다. 핵심은 연속된 수들을 효율적으로 찾는 방법이다.

 

2. 접근 방식 — HashSet 활용

단순히 배열을 정렬한 후 연속 시퀀스를 찾으면 O(n log n) 시간(sort 정렬)이 걸리는데,  하지만 HashSet을 사용하면 O(n) 시간에 해결 가능하다.

 

핵심 아이디어

  1. 모든 수를 HashSet에 저장한다.
  2. 각 수가 연속 시퀀스의 시작점인지 확인한다. 즉, 시작점 조건은 num - 1이 Set에 없는 경우.
  3. 시작점이면, while 문을 이용하여, num부터 연속된 수를 하나씩 세어 길이를 구한다.
  4. 모든 시작점에 대해 반복하며 최대 길이를 갱신한다.

핵심 포인트는 시작점만 검사하면 중복 계산을 피할 수 있다는 것인데, 왜냐하면 시작점이 아닌 값은 시작점인 값에서 연속된 수를 셀 때 포함되기 때문이다. 

 

3. 풀이 코드 (HashSet)

var longestConsecutive = function(nums) {
  const numsSet = new Set(nums); 
  let longest = 0;

  for (const num of numsSet) {
    const isStarting = !numsSet.has(num - 1); // 시작점 체크
    if (isStarting) {
      let length = 1;
      let current = num;
      
      // while 문에서 업데이트 하기 위해 num 이 아닌 current 를 사용해야 한다.
      while (numsSet.has(current + 1)) {
        length++;
        current++;
      }

      longest = Math.max(longest, length);
    }
  }

  return longest;
};

 

 

예시 시나리오1

Input: [100, 4, 200, 1, 3, 2], 최종 결과 -> 4

단계수 HashSet 포함 여부 현재 길이 최대 길이
1 100 시작점 1 1
2 4 시작점 아님(4단계에 포함됨) - 1
3 200 시작점 1 1
4 1 시작점 1 → 2 → 3 → 4 4 ✅

 

예시 시나리오2

Input: [8,3,7,2,5,0,4,6,0,1], 최종 결과 → 9

단계 탐색 중인 숫자(num) 시작점 여부 (num-1 존재?) 연속 길이  탐색최장 길이(longest)
1 8 시작점 아님 (7 존재) - 0
2 3 시작점 아님 (2 존재) - 0
3 7 시작점 아님 (6 존재) - 0
4 2 시작점 아님 (1 존재) - 0
5 5 시작점 아님 (4 존재) - 0
6 0 시작점 (−1 없음) 0→1→2→3→4→5→6→7→8 (9단계) 9
7 4 시작점 아님 (3 존재) - 9
8 6 시작점 아님 (5 존재) - 9
9 1 시작점 아님 (0 존재) - 9 ✅

시간 및 공간 복잡도

항목 복잡도 설명
시간 O(n) HashSet에 삽입 및 각 수에 대해 연속 시퀀스 검사
공간 O(n) HashSet 저장

 

4. 풀이 코드 (정렬 기반 — 비효율적)

var longestConsecutive = function(nums) {
  if (nums.length === 0) return 0;
  const sortedNums = Array.from(new Set(nums)).sort((a, b) => a - b);
  
  let result = 1;
  let tempo = 1;

  for (let i = 1; i < sortedNums.length; i++) {
    if (sortedNums[i] - sortedNums[i - 1] === 1) {      
      tempo++;      
    } else {      
      tempo = 1;
    }
    result = Math.max(result, tempo);
  }

  return result;
};

이 방법은 정렬 때문에 O(n log n) 시간 복잡도를 갖는다. 연속 수를 찾는 아이디어는 동일하지만, 최적화된 HashSet 방식이 더 효율적입니다.

 

5. 핵심 정리

  • 문제 유형: HashSet, Array, 연속 수 시퀀스
  • 핵심 아이디어:
    1. 각 수가 연속 시퀀스 시작점인지 확인
    2. 시작점이면 연속 수 길이를 계산
    3. 최대 길이를 갱신
  • 시간 복잡도: O(n)
  • 공간 복잡도: O(n)
  • 포인트: 시작점만 검사 → 중복 계산 방지

'Coding Test > LeetCode' 카테고리의 다른 글

125. Valid Palindrome  (0) 2025.10.22
20. Valid Parentheses  (0) 2025.10.22
49. Group Anagrams  (0) 2025.10.21
57. Insert Interval  (0) 2025.10.20
56. Merge Intervals  (0) 2025.10.20
'Coding Test/LeetCode' 카테고리의 다른 글
  • 125. Valid Palindrome
  • 20. Valid Parentheses
  • 49. Group Anagrams
  • 57. Insert Interval
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;)
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
        • Web Development
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • React
        • Next.js
        • Flutter
        • Testing
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test
        • LeetCode
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML &amp; CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    스코프
    VoiceJournal
    CPU scheduling algorithm
    DOM
    모던 자바스크립트 Deep Dive
    프론트엔드 성능 최적화 가이드
    Operating System
    How memory manage data
    TCP/IP
    Network
    Binary Tree BFS
    leetcode
    testing
    need a database
    mobile app
    database
    js pattern
    이벤트
    indie hacker
    딥다이브
    Shared resources
    커리어
    polylingo
    자바스크립트 딥다이브
    Javascript Essentials
    Time complexity and Space complexity
    Data Structure
    Threads and Multithreading
    자바스크립트
    structure of os
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
128. Longest Consecutive Sequence
상단으로

티스토리툴바