[LeetCode] Top review 150; Remove Element

Eunbi Lee·2026년 5월 3일

Algorithm

목록 보기
9/13
post-thumbnail

Problem

Remove Element

Background

  • int[] nums 와 int val 이 주어진다.
  • nums 에서 존재하는 모든 val 값을 제거한다.
  • int[] 에서의 남겨진 원소 순서는 중요하지 않음.

Solve

힌트

정수형 배열에서 특정 값을 삭제해야 한다는 점에서 여러 방법이 생각났다.

  • 삭제해야 할 값을 특정 값(ex. "x")으로 치환한다.
  • 연산이 자유로운 List 로 변환한 다음, 실제 값을 삭제한다.

그런데, 전자의 경우 정수형 배열에서 굳이 문자형 타입의 값으로 치환해야 한다는 점이 번거롭다.

  • 그럼, 어차피 정수형 배열 속 원소 값들은 모두 0 이상이니, -1 로 치환하면 되지 않냐? 는 생각이 떠오를 수도 있는데, 굳이? 이다.
    • 뭔가 직감적으로 치환해서 얻을 장점이 없기 때문에, 이 생각은 보류하기로 했다.

그리고 후자의 경우, 정수형 배열 속 모든 원소를 순회해야 한다는 점에서 실제 값을 삭제할 수 없다.

  • 삭제할 경우, 전체 인덱스의 크기는 줄어들고 순회할 때 바로 Index bound of Exception 이 발생할 수 있기 때문이다.

그럼 어떤 방법이 좋을까?

유효한 원소들만 골라 세면 되지 않을까? 란 생각을 하게 됐다.

Two-pointer

투 포인터는 말 그대로 배열에 두 개의 인덱스를 사용하는 것이다.

  • 하나는 순회용, 하나는 유효한 원소의 개수를 나타낼 용도다.
    • 이하, searchIndexkeepIndex 라고 하겠다.
      • keepIndex 란 말이 좀 헷갈릴 수도 있는데, 직관적으로 유효한 원소의 위치를 가리키기 위함이다.

먼저 searchIndex 의 경우, 정말 배열을 순회만 하면 된다.

  • 단지, 배열 전체를 순회하면서 유효한 원소를 올바르게 셀 수 있도록 순회만 하면 된다.

그리고, keepIndex 의 역할은 다음과 같다.

  1. int nums[searchIndex] 값이 val 일 경우,
  • keepIndex 및 nums[keepIndex] 의 값은 변하지 않는다.
    • 동시에 searchIndex 는 다음 원소로 순회를 진행한다.
  1. nums[searchIndex] 값이 val 이 아닐 경우,
  • keepIndex 의 값을 1 증가시킨다.
    • 그리고 nums[keepIndex] 에 nums[keepIndex] 의 값을 저장한다.
    • 이는 유효한 원소를 keepIndex 가 가리키고 있음을 의미한다.
    • 동시에 searchIndex 는 다음 원소로 순회를 진행한다.

이를 반복하면, nums 에는 왼쪽에서부터(즉, index = 0 부터) 차례대로 유효한 원소가 쌓이는 형태를 갖추게 된다.

그리고, keepIndex 는 차례대로 유효한 원소를 셀 때마다 증가했으므로 최종적으로 유효한 원소의 개수 그 자체를 저장하고 있다.

이를 반환하면 된다.

정답

class Solution {
    public int removeElement(int[] nums, int val) {
        int result = 0;

        int keepIndex = 0;
        for (int searchIndex = 0; searchIndex < nums.length; searchIndex ++) {
            if (nums[searchIndex] == val) continue;

            nums[keepIndex] = nums[searchIndex];            
            keepIndex ++;
        }

        result = keepIndex;
        return result;
    }
}

ETC

searchIndex 가 유효하지 않은 원소 - 즉, val 을 만났을 때 어떤 행위를 해야 하는지? 와 유효한 원소를 만났을 때, keepIndex 의 값을 어떻게 활용해야 하는지? 가 keypoint 인 것 같다.

profile
안녕하세요, 개발자 비비입니다.

0개의 댓글