알고리즘 문제/Easy

[Easy] 배열 요소 삭제하기 - 27. Remove Element

네야_IT 2024. 8. 6. 03:18
반응형

주어진 정수 배열 nums와 정수 val이 주어졌을 때, nums에서 val의 모든 발생을 제자리에서 제거합니다. 요소의 순서는 변경될 수 있습니다. 그런 다음 val과 같지 않은 요소의 수를 반환합니다.

 

val과 같지 않은 요소의 수를 k라고 할 때, 다음의 작업을 수행하여 승인을 받아야 합니다:

int[] nums = [...]; // 입력 배열
int val = ...; // 제거할 값
int[] expectedNums = [...]; // 올바른 길이를 가진 예상 답안.
// val과 같은 값이 없으며 정렬되어 있음.

int k = removeElement(nums, val); // 구현을 호출함

assert k == expectedNums.length;
sort(nums, 0, k); // nums의 처음 k개의 요소를 정렬함
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

배열 nums를 변경하여 nums의 처음 k개의 요소가 val과 같지 않은 요소를 포함하도록 합니다. nums의 남은 요소들은 중요하지 않으며, nums의 크기도 중요하지 않습니다. k를 반환합니다.

 

예시 1:

  • 입력: nums = [3,2,2,3], val = 3
  • 출력: 2, nums = [2,2,_,_]
  • 설명: 함수는 k = 2를 반환해야 하며, nums의 처음 두 요소는 2여야 합니다. 반환된 k 이후의 요소들은 중요하지 않습니다 (따라서 밑줄로 표시).

예시 2:

  • 입력: nums = [0,1,2,2,3,0,4,2], val = 2
  • 출력: 5, nums = [0,1,4,0,3,_,_,_]
  • 설명: 함수는 k = 5를 반환해야 하며, nums의 처음 다섯 요소는 0, 1, 4, 0, 3을 포함해야 합니다. 이 다섯 요소는 어떤 순서로든 반환될 수 있습니다. 반환된 k 이후의 요소들은 중요하지 않습니다 (따라서 밑줄로 표시).

제약 조건:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

 

풀이

 

두 개의 포인터를 가지고 배열을 순차적으로 검사하면 됩니다. j는 배열의 모든 요소를 탐색합니다. 탐색중 삭제해야 하는 val과 다른 값을 가지고 있다면 현재 i 포인터의 위치의 값에 쓰고 i를 증가 시킵니다. 모든 탐색이 끝나게 되면 우리가 삭제해야하는 배열 요소만 삭제하고 원하는 답을 구할 수 있습니다.

class Solution:

    def removeElement(self, nums: List[int], val: int) -> int:
        i = 0
        for j in range(len(nums)):
            if nums[j] != val:
                nums[i] = nums[j]
                i += 1
        return i
 
 
 
반응형