Zero to Hero
article thumbnail
 

Remove Duplicates from Sorted Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

1. 선형 탐색 로직

from typing import *


class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        saved_val, target_index = nums[0], 1
        for i in range(len(nums)):
            if i == 0:
                continue
            else:
                if nums[i] == saved_val:
                    continue
                else:
                    saved_val, nums[target_index] = nums[i], nums[i]
                    target_index += 1
        gap = len(nums) - target_index
        while gap > 0:
            nums.pop()
            gap -= 1
        return len(nums)

정수로 구성된 오름차순으로 정렬된 리스트가 주어진다.

이 리스트를 추가 공간 없이, 즉 주어진 리스트 내부의 조작만을 이용해 중복된 정수를 제거하는 로직을 작성하는 문제다.

 

결국 이 문제는 리스트의 순서를 흐트러트리지 않고 새로운 값이 등장했을 때 다음 인덱스마다 추가해주면 된다.

 

이 문제를 해결하는 데 2개의 변수를 사용했다.

saved_val은 가장 마지막에 출현한 값을, target_index는 새로운 값이 들어가야 하는 인덱스를 저장하는 변수다.

이제 주어진 nums 리스트를 0번 인덱스부터 선형 탐색하는데 로직은 다음과 같다.

 

1. 만일 현재 인덱스가 가리키는 값(nums[i])가 가장 마지막에 출현한 값(saved_val)과 같다면 이 값은 중복 값이기 때문에 그냥 지나간다.

2. nums[i]와 saved_val이 같지 않다면 중복이 아닌 새로운 값이기 때문에 그 숫자가 문제에서 요구하는 위치에 있어야 할 곳(nums [target_index])의 값으로 바꿔주고, target_index의 값을 1 올려준다.

3. 위 작업이 끝난 후 불필요한 부분(len(nums) - target_index) 만큼 길이는 pop 연산으로 버려준다.

 

시뮬레이션하면 다음과 같다.

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

saved_val: 0, target_index:1
nums: [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]

i: 0, saved_val: 0, target_index:1
nums: [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]

i: 1, saved_val: 0, target_index:1
nums: [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]

i: 2, saved_val: 1, target_index:2
nums: [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]

i: 3, saved_val: 1, target_index:2
nums: [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]

i: 4, saved_val: 1, target_index:2
nums: [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]

i: 5, saved_val: 2, target_index:3
nums: [0, 1, 2, 1, 1, 2, 2, 3, 3, 4]

i: 6, saved_val: 2, target_index:3
nums: [0, 1, 2, 1, 1, 2, 2, 3, 3, 4]

i: 7, saved_val: 3, target_index:4
nums: [0, 1, 2, 3, 1, 2, 2, 3, 3, 4]

i: 8, saved_val: 3, target_index:4
nums: [0, 1, 2, 3, 1, 2, 2, 3, 3, 4]

i: 9, saved_val: 4, target_index:5
nums: [0, 1, 2, 3, 4, 2, 2, 3, 3, 4]

불필요한 부분을 pop으로 제거
nums: [0, 1, 2, 3, 4, 2, 2, 3, 3]
nums: [0, 1, 2, 3, 4, 2, 2, 3]
nums: [0, 1, 2, 3, 4, 2, 2]
nums: [0, 1, 2, 3, 4, 2]
nums: [0, 1, 2, 3, 4]

5

 

이전에 비슷한 접근법을 경험한 적이 있어서 빠르게 풀 수 있었다.

'Algorithm' 카테고리의 다른 글

125. Valid Palindrome  (0) 2021.06.08
118. Pascal's Triangle  (0) 2021.06.07
13. Roman to Integer  (0) 2021.05.31
202. Happy Number  (0) 2021.05.30
326. Power of Three  (0) 2021.05.28
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!