코드노트

LeetCode 26. Remove Duplicates from Sorted Array 배열 문제 풀이 본문

Code note/자바스크립트 알고리즘 문제풀이

LeetCode 26. Remove Duplicates from Sorted Array 배열 문제 풀이

코드노트 2022. 9. 18. 20:46
더보기

문제 설명

일부 언어에서는 배열의 길이를 변경할 수 없으므로 대신 배열 번호의 첫 번째 부분에 결과를 배치해야 합니다.

더 공식적으로, 중복을 제거한 후 k 요소가 있으면 nums의 처음 k 요소가 최종 결과를 보유해야 합니다.

처음 k개 요소를 넘어 무엇을 남겨두는지는 중요하지 않습니다.

숫자의 처음 k 슬롯에 최종 결과를 배치한 후 k를 반환합니다.

다른 어레이에 추가 공간을 할당하지 마십시오.

O(1) 추가 메모리를 사용하여 제자리에서 입력 배열을 수정하여 이 작업을 수행해야 합니다.

와..문제 이해가 이렇게 어려운건 또 처음인거같다.. easy문제인데 계속 맞게 문제를 풀었는데 테스트가 통과되지 않았다..

내가 문제 이해를 못했구나... 배열을 return하려고 했는데 배열을 return하는게 아니였다... 

간단하게 문제를 설명하면?

주어진 배열에서 중복값을 없앤 길이를 출력하는 되는 문제였다!

그리고 또 하나의 조건은 input배열을 그대로 써야한다. 새로운 배열을 만들면 안되는 문제였다...

 

그리고 여기 보면 문제를 채점할때의 기준이 나와있었다.

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];
}

- 요약하자면 k개의 개수만큼 배열의 앞에서부터 순서대로 중복을 없앤 요소들을 체크하겠다는 의미다.

- 그 뒤에 있는 배열은 신경쓰지 않는다. 즉 지우지 않아도 된다..!

 

하 이런 문제들을 만날때마다 현타가 너무 온다..

이렇게 쉬운문제도 바로바로 이해가 안되다니ㅠㅠ....

 

let nums = [1, 1, 2];

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

console.log(removeDuplicates(nums));

// for(i)   k     nums[i]   nums[k]
// i = 0, k = 0  |    1    :   1
// i = 1, k = 0  |    1    :   1
// i = 2, k = 0  |    2    :   1 // 여기서 k++ 하면 k는 1이 된다. 그럼 nums[1]에 nums[i]값인 2를 넣어준다.
// 그럼 nums는 [1,2,2]가 되고, return한 k값만큼 nums배열을 확인하면 [1, 2]를 확인한다.

- k변수를 만든다.

- 만약 배열의 길이가 0이면 0을 리턴시킨다.

- 반복문을 통해서 nums[i]와 nums[k]를 비교한다. 같은 값이 아니면 k++ 후 nums[k]에 num[i]를 담아준다.

 

let nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4];

// for(i)   k     nums[i]   nums[k]
// i = 0, k = 0  |    0    :   0
// i = 1, k = 0  |    0    :   0
// i = 2, k = 0  |    1    :   0 // 여기서 k++ == k = 1 / nums[1]에 nums[i]값인 1을 넣어준다.
// nums = [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]
// i = 3, k = 1  |    1    :   1
// i = 4, k = 1  |    1    :   1
// i = 5, k = 1  |    2    :   1 // 여기서 k++ == k = 2 / nums[2]에 nums[i]값인 2를 넣어준다.
// nums = [0, 1, 2, 1, 1, 2, 2, 3, 3, 4]
// i = 6, k = 2  |    2    :   2
// i = 7, k = 2  |    3    :   2 // 여기서 k++ == k = 3 / nums[3]에 nums[i]값인 3를 넣어준다.
// nums = [0, 1, 2, 3, 1, 2, 2, 3, 3, 4]
// i = 8, k = 3  |    3    :   3
// i = 1, k = 0  |    4    :   3 // 여기서 k++ == k = 4 / nums[4]에 nums[i]값인 4를 넣어준다.
// nums = [0, 1, 2, 3, 4, 2, 2, 3, 3, 4]
// 그럼 nums는 [0, 1, 2, 3, 4, 2, 2, 3, 3, 4]가 되고,
// return한 k값 = 4 + 1 만큼 nums배열을 확인하면[0, 1, 2, 3, 4]를 확인한다.

- 다른 Input값을 보게되면 진행되는 순서를 작성해봤다. 이렇게 하나하나씩 배열이 늘어간다고 보면된다.

 

이 외에도 slice를 사용하는 방법이나 while문을 사용하는방법도 있었다.

약간 이문제를 풀면서 다시 한번 코딩테스트문제들을 여러가지 풀어봐야겠다는 생각을 한거같다..