Remove Duplicates from Sorted Array

zoovely·2023년 6월 18일
0
post-thumbnail

💬 문제

[문제링크]
오름차순으로 정렬된 int 배열 nums에서
중복된 요소를 제거하고 중복되지 않는 요소의 수 k 반환
in-place하게 이루어져야 하고, nums의 길이는 중요하지 않음
(= 중복 요소를 뒤로 밀어도 됨)

✍️ 나의 풀이

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    let k = 0;
    let len = nums.length;

    for (let i = 0; i < len; i++) {
        if (nums[i] !== nums[i + 1]) {
            nums[k] = nums[i];
            k++;
        }
    }

    return (k);
};

드디어 3연속 배열 문제에서 효율적인 방법을 따라할 수 있게 되었다.
이전 문제와 아주 비슷한 방식으로 중복되지 않은 요소를 앞으로 당겨서 값을 바꾸는 방법이다.
모든 배열을 돌면서 지금과 다음 값이 다를 때 지금 값을 인덱스 k(0부터 시작)에 대입하고 k를 증가하면서 새 배열을 만드는 것 처럼 쌓아갔다.
중복되지 않은 요소의 개수는 k를 반환하면 끝!

📌 결과

Accepted
Runtime 87ms (Beats 30.30%)
Memory 43.8MB (Beats 98.59%)

📚 러닝 포인트

사실 너무나 쉽고 또 빠르게 풀었기 때문에 특별한 배움은 없었다. 그런데 메모리 효율에 비해 런타임 효율이 많이 안좋아서 다른 사람의 풀이를 찾아보았다.

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

거의 모든 방법이 같았지만 나는 지금의 인덱스와 다음의 인덱스를 비교하는 대신 이 사람은 내 풀이에서의 k와 배열을 순회하는 j를 비교하였다. 솔직히 비슷할거라고 생각하는데(...) 왜 인지 이 코드는 98%가 나온다. 게다가 나는 length를 따로 변수에 담아서 for문을 돌때마다 length를 체크하지도 않는데... 하지만 메모리 효율에서는 내 코드가 우세했다. 이런 이유를 찾는게 러닝 포인트겠지만 다음에 해보도록 하겠다.

profile
나도 할 수 있을까?

0개의 댓글