관리 메뉴

FU11M00N

[LeetCode] Remove Duplicates from Sorted Array II - Javascript 본문

알고리즘

[LeetCode] Remove Duplicates from Sorted Array II - Javascript

호IT 2023. 8. 24. 00:46

Remove Duplicates from Sorted Array II

[정렬된 배열에서 중복되는 값 제거(최대 2개는 중복을 허용)]

 

제약 조건 

int[] nums = [...]; // Input array
int[] expectedNums = [...]; // The expected answer with correct length

int k = removeDuplicates(nums); // Calls your implementation

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

Example

ex1) Input: nums = [1,1,1,2,2,3]
     Output: 5, nums = [1,1,2,2,3,_]

ex2) Input: nums = [0,0,1,1,1,1,2,3,3]
     Output: 7, nums = [0,0,1,1,2,3,3,_,_]

문제 접근 방식

중복되는 배열을 제거해야 하지만, 최대 2개의 같은 값을 남겨두고 중복을 제거해야 한다.

또한 "in-place"로 추가 배열은 생성하면 안된다.

 

먼저 nums[i]와 num[i+1]를 비교해 둘이 같은 값 이고 nums[i+1]와 nums[i+2]를 비교하여

이것마저도 같다면 num[i+2] 인덱스를 삭제해야겠다고 생각했다.

solve 전체 코드

/**
 * @param {number[]} nums
 * @return {number}
 */

var removeDuplicates = function (nums) {
   for (let i = 0; i < nums.length; i++) {
      if (nums[i] === nums[i + 1] && nums[i + 1] === nums[i + 2]) {
         nums.splice(i + 2, 1);
         i--;
      }
   }
   return nums.length;
};

 

처음에 생각해낸 방법으로 바로 문제를 풀이 했다.

 

다른 sovle 코드

var removeDuplicates = function(nums) {
    if(nums.length <= 2) {
        return nums.length;
    }
  
    let k = 2;

    for(let i = 2; i < nums.length; i++){
        if(nums[i] != nums[k - 2] || nums[i] != nums[k - 1]){
            nums[k] = nums[i];
            k++;
        }
    }
    return k;
};

이 코드를 아무리 눈으로 읽어봐도 이해가 되지 않아 화이트보드에 그림을 그려서 for 문을 하나하나 실행해 봤다.
그림을 그리면서도 이게 왜 작동될까에 대해 고민을 했고,
내 기준에서 아직 이해하기에 어려운 로직이라고 느꼈다. 다음부터라도 이 문제와 같은 유형 풀었을 때 이렇게 풀 자신이 없다.
다만 문제를 많이 풀다 보면 이런 식으로 풀어야겠다 하며 생각할 날이 올 것 같다.
이 코드에 대해 100% 이해한 것은 아니지만 내가 이해한 대로 적어보겠다.

우선 splice를 사용하지 않고 풀이가 가능하다.


먼저 배열의 길이가 2일 때 예외 처리를 해준다.

nums 배열은 이미 정렬되어 있고 최대 2개의 중복은 허용이기에 어떠한 값이 들어와도 2개일 때는 중복제거를 할 일이 없다.

 

반복문의 조건문에서 필자가 작성한 코드는 같으면 중복제거를 해야 할 대상으로 봤지만,
이 코드는 같지 않으면 nums 배열에 들어가야 할 대상으로 보는 거다.
이렇게 작성하면 k를 기준으로 if 문 조건에 부합하면 nums 배열에 들어가야 할 대상으로 보는 거다.

Comments