27. 요소 제거

정수 배열 번호와 정수 값이 지정된 경우에는 num in-place에서 발생하는 모든 val을 제거합니다.

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

더 형식적으로, 중복을 제거한 후 k개의 요소가 있으면 num의 첫 번째 k개의 요소가 최종 결과를 유지해야 한다.

첫 번째 k 요소 이후에 무엇을 남겨두는지는 중요하지 않다.

최종 결과를 숫자의 첫 번째 k 슬롯에 배치한 후 k를 반환한다.

다른 배열에 추가 공간을 할당하지 마십시오. O(1)개의 추가 메모리가 있는 입력 배열을 수정하여

이 작업을 수행해야 합니다.

사용자 정의 심판:

심판은 다음 코드를 사용하여 솔루션을 테스트합니다:

 

예 1:
입력: nums = [3,2,2,3], val = 3
출력: 2, nums = [2, 2, __]
설명: 함수는 k = 2를 반환해야 하며, num의 처음 두 요소는 2입니다.
반환된 k 이외에 무엇을 남겨두는지는 중요하지 않습니다(따라서 밑줄입니다).


예 2:
입력: nums = [0,1,2,2,3,0,4,2], val = 2
출력: 5, nums = [0,1,4,0,3,__]
설명: 함수는 0, 0, 1, 3 및 4를 포함하는 num의 처음 5개 원소와 함께 k = 5를 반환해야 합니다.
5개의 요소는 임의의 순서로 반환될 수 있습니다.
반환된 k 이외에 무엇을 남겨두는지는 중요하지 않습니다(따라서 밑줄입니다).

 

문제 정리
*새로운 배열을 만들어서 값을 할당 할 수 없다.기존의 배열에 직접 수정해서 문제를 풀어야한다.
*배열에서 val와 같은 모든 요소 제거해야한다.
*제거된 요소 이후의 요소들은 배열을 앞으로 이동시켜야 한다.

1. 배열을 순회하면서 val과 같은 요소를 제거한 후, 배열의 길이를 반환하는 문제이다.

생각한 방법
1. i 타켓을 만든다. 배열을 처음부터 순회하면서 val와 같은 요소를 찾는다.
2. 같은 요소를 찾으면 해당 요소를 nums 배열에서 제거한다. 
(이때 새로운 배열을 할당하면안되고 기존의 배열을 앞으로 이동시켜야한다. 
수정된 요소는 배열의 맨 처음에 할당되어야한다.)
3. nums의 길이만큼 같은 요소를 반복해서 찾는다.
4. 최종적으로 구한 배열의 길이를 반환한다.

 

작성코드📍

      function removeElement(nums, val) {
        let i = 0; //배열의 첫번째 인덱스부터 저장하는 포인터
        for (let j = 0; j < nums.length; j++) { //배열을 비교하기 위한 j
          if (nums[j] !== val) { //다른 요소를 찾으면 
            nums[i] = nums[j]; //배열의 첫번째 인덱스로 포인터 이동 후, 그안에 비교한 j값을 넣어준다.
            i++;
          }
        }
        return i;
      }
      let nums = [3, 2, 2, 3],
        val = 3;
      console.log(removeElement(nums, val));

 

1. nums[i]와 nums[j]는 각가 어떤 역할을 하는가?

조건문이 성립될때 nums[i]와 nums[j]는 nums 배열의 각 요소를 나타낸다.

코드에서 i는 nums 배열에서 val과 같은 요소를 제거한 후,

nums 배열의 첫 번째 인덱스부터 남은 요소들을 저장하기 위한 포인터이다.

j는 nums 배열을 처음부터 순회하며 현재 비교하는 요소를 나타낸다.

따라서, nums[j]와 val이 다를 때, nums[i]에 nums[j] 값을 할당하는 것은 nums 배열에서 val과 같은 요소를 제거하고

남은 요소들을 nums 배열에서 첫 번째 인덱스부터 저장하기 위한 것이다.

 

복사했습니다!