Coding Test/LeetCode

26.Remove Duplicates from Sorted Array

JTB 2025. 10. 15. 14:45

난이도: Easy

링크: LeetCode 26

풀이 날짜: 2025/10/15

 

1. 문제 이해

정렬된 배열 nums가 주어질 때, 중복된 요소를 제거하고 고유한 요소만 남긴 후, 그 길이를 반환해야 한다.

단, 새로운 배열을 만들면 안 되고, 주어진 배열 nums를 직접 수정(in-place)해야 한다.

즉, 문제의 핵심은 배열을 정리(clean up)하면서 중복을 제거하는 효율적인 방법을 찾는 것이다.

 

2. 아이디어: Two Pointers

두 개의 포인터를 사용해 배열을 한 번 순회하며, 중복되지 않은 값만 앞으로 모으는 방식이다.

포인터 역할
i 배열을 순회하면서 현재 원소 확인
current 유일한 요소를 저장할 다음 위치

배열이 정렬되어 있으므로, 인접한 두 원소가 다르면 새로운 고유 값이 등장한 것이다.

 

3. 풀이 코드

var removeDuplicates = function(nums) {
  let current = 1; // 첫 번째 요소는 항상 고유하므로, 두 번째 요소부터 비교를 시작한다.

  for (let i = 1; i < nums.length; i++) {
    // 현재 값이 바로 앞의 고유 값(nums[current - 1])과 다르면, 새로운 값으로 간주한다.
    const isUnique = nums[i] !== nums[current - 1];
    if (isUnique) {      
      // 새로운 고유 값이 등장하면 current 위치에 덮어쓰고, current를 한 칸 이동시킨다.
      nums[current] = nums[i];
      current++;
    }
  }

  return current;
};

 

시간 복잡도는 한 번의 순회만 진행하므로 O(n)

공간 복잡도는 상수 공간을 사용하므로 O(1)

 

4. 요약 및 정리

포인트 설명
in-place 수정 추가 배열 없이 기존 배열을 직접 수정
Two Pointers 하나는 순회, 하나는 유일한 값의 위치 추적

 

풀이 코드 중 이 한줄이 포인트라고 할 수 있다. 

if (nums[i] !== nums[current - 1]) nums[current++] = nums[i];

배열을 깔끔하게 정리하며, current중복 제거 후의 배열 길이를 반환한다.