관리 메뉴

FU11M00N

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

알고리즘

[LeetCode] Remove Duplicates from Sorted Array - Javascript

호IT 2023. 8. 23. 23:49

Remove Duplicates from Sorted Array

[정렬된 배열에서 중복되는 값 제거]

 

 

제약 조건 

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,2]
     Output: 2, nums = [1,2,_]

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

초기 문제 접근 방식

nums 배열에 있는 값들을 중복 제거하면 문제가 풀리겠다고 생각했다.자바스크립트의 filter와 indexOf를 사용해 중복제거를 할 수있다.

 

indexOf(): 배열에서 특정 값이 처음으로 나타나는 index를 리턴
filter(el, index, arr): 특정 조건에 부합하는 배열의 모든 값을 배열 형태로 리턴

el: 요소값

index: arr에서 요소의 index 값

arr: 순회하는 대상

초기 전체코드

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
   nums = nums.filter((el, index, arr) => {
      return arr.indexOf(el) === index;
   });
   console.log(nums);
   return nums.length;
};

다시 생각 해보며..

분명 case1, 2 모두 Stdout은 올바르게 출력이 되는데 Output은 중복제거된 배열로 출력되지 않았다.


remove the duplicates in-place such that each unique element appears only once.
letcode에서 문제를 처음 풀어봐 익숙지 않았던 문제가 있었는데, 바로 "in-place"다.
nums 배열은 아마 call by ref로 넘어와 주어진 nums 배열에서 처리해야 한다.


생각해 보니 이전 문제들에서도 "in-place"가 있었는데,

별도의 변수를 생성해서 문제를 푼 게 아닌 바로 splice 같은 것을 했기 때문에 풀렸다.
filter는 새 배열로 반환해 주기 때문에 nums 배열이 새로 만들어져 계속 문제 풀이에 실패했던 것 같다.

그렇기에 이번 문제에선 filter 메서드를 사용하지 않고 nums에 일일이 접근해 중복제거를 하여 풀어야겠다고 생각했다.

 

solve 전체 코드

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
   let tmp = nums[0];
   for (let i = 1; i <= nums.length; i++) {
      if (nums[i] === tmp) {
         nums.splice(i, 1);
         i--;
      }
      tmp = nums[i];
   }
   return nums.length;
};

tmp 변수를 생성해 해당 변수에 첫 번째 값만 초기화해주고, 반복문을 사용해 뒤에 있는 값과 비교해 값이 같은지 비교했다.

그 후 값이 같다면 splice로 해당 배열을 삭제하고 tmp 값을 계속 변경해 주며 비교했다.

nums 배열은 정렬된 상태로 오기 때문에 배열 인덱스의 바로 뒤의 값과 비교해도 문제없다.

다른 sovle 코드

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
   var tmp = 0;

   for (let i = 0; i < nums.length; i++) {
      if (nums[tmp] !== nums[i]) {
         tmp++;
         nums[tmp] = nums[i];
      }
   }
   return tmp + 1;
};

위의 방식으로 splice를 사용하지 않고 풀이가 가능하다.

tmp 변수를 0으로 초기화하고 반복문에 nums[tmp] 값과 nums[i]를 비교 해

값이 같지 않다면 tmp를 증가시키고 증가 한 값을 nums[i]에 넣는다.

Comments