본문으로 바로가기

[LeetCode] removeElement

category Algorithm/LeetCode 2022. 3. 31. 00:05
728x90
반응형

 

 

문제

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The relative order of the elements may be changed.

Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the first part of the array nums. More formally, if there are k elements after removing the duplicates, then the first k elements of nums should hold the final result. It does not matter what you leave beyond the first k elements.

Return k after placing the final result in the first k slots of nums.

Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.
Input: nums = [3,2,2,3], val = 3
Output: 2, nums = [2,2,_,_]
Explanation: Your function should return k = 2, with the first two elements of nums being 2.
It does not matter what you leave beyond the returned k (hence they are underscores).
 

접근방법

in-place 라서 추가적인 메모리를 사용하면 안 될 것 같다. for문으로 순차적으로 접근해서 val이랑 같은 값이면 뒤에다가 추가한 다음 삭제해버리는 방식을 사용했다. 결과적으로 `+1 -1 = 0` 이니 문제에서 요구하는 조건은 달성하지 않나 싶다.
 

Code

사실 이 문제는 옛날에 풀어봤는데 다시 풀겸 예전 코드를 봤는데 상당히 이상한 코드로 쓰여져 있었다.
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:

        if not nums: return len(nums)

        if val in nums:
            for index in range(len(nums)):
                for idx, value in enumerate(nums):
                    if value == val:
                        nums.append('_')
                        nums.pop(idx)
            if nums.index('_'):
                return len(nums[:nums.index('_')])
            else:
                return 0
        else:
            return len(nums)
이번엔 나름 개선한다고 개선해봤다.
class Solution:
    def removeElement(self, nums, val):
        for idx in range(len(nums)):
            if nums[idx] == val:
                nums.append(nums[idx])
                nums.remove(nums[idx])

        print(nums)
        return len(nums) - nums.count(val)

 

 

후기

문제 설명을 읽다가 뒤로 보내진 원소들이 '_' 처리가 된 걸 보고 똑같이 해봐야겠다라는 생각이 들었는데 시간이 길어지니 패스하기로 했다. 생각이 꼬이기 시작했고 풀이 방법을 참조해서 위와 같이 풀어봤는데 유투브 영상 중에 어마어마한 코드를 발견했다. (while 문을 쓰는 건 상상도 못했는데.. ?!)

while nums.count(val):
	nums.remove(val)

 

 

 

 

728x90
반응형

'Algorithm > LeetCode' 카테고리의 다른 글

[LeetCode] Best Time to Buy and Self Stock  (0) 2022.04.04
[LeetCode] Array-partition-i  (0) 2022.03.29
[LeetCode] Two Sum  (0) 2021.10.03
[Leet Code] longest-palindromic-substring  (1) 2021.09.29
[Leet Code] Group Anagrams  (0) 2021.09.26