LeetCode/NeetCode
[Two Pointers] 80. Remove Duplicates from Sorted Array II
hyunkookim
2024. 11. 25. 17:42
80. Remove Duplicates from Sorted Array II
https://youtu.be/ycAq8iqh0TI?si=xnT3SvO1n9jkMNVq
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
k = 0 # 중복되지 않은 요소를 저장할 위치를 추적하는 포인터
prev = nums[0] - 1 # 이전에 저장된 값을 추적하기 위한 변수, nums[0]보다 작은 값으로 초기화
cnt = 0 # 현재 숫자가 몇 번 등장했는지 추적
# 배열을 순회하며 중복을 제거
for i in range(len(nums)):
if nums[i] > prev: # 새로운 값이 나왔을 때
nums[k] = nums[i] # 새로운 값을 nums[k] 위치에 저장
k += 1 # 다음 저장 위치로 이동
cnt = 1 # 새로운 값의 등장 횟수를 1로 초기화
prev = nums[i] # 현재 값을 이전 값으로 업데이트
elif nums[i] == prev and cnt < 2: # 동일한 값이지만 최대 2번까지 허용
nums[k] = nums[i] # 값을 nums[k] 위치에 저장
k += 1 # 다음 저장 위치로 이동
cnt += 1 # 동일한 값의 등장 횟수 증가
else: # 동일한 값이 2번 이상 등장한 경우
cnt += 1 # 등장 횟수만 증가하고 저장은 하지 않음
return k # 중복되지 않은 요소의 개수 반환
최종 코드
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
# 주어진 nums 배열은 비내림차순 정렬되어 있음 (즉, 같거나 증가하는 순서)
# 중복 허용은 최대 2번까지, 그 이상은 제거해야 함
l, r = 0, 1 # l은 중복을 허용할 위치, r은 현재 검사 중인 위치
curCount = 0 # 현재 숫자가 몇 번 중복되었는지 저장
for r in range(1, len(nums)):
if nums[l] != nums[r]:
# 새 숫자가 나오면 중복 카운터 초기화
curCount = 0
l += 1
nums[l] = nums[r] # 새 숫자를 l 위치에 저장
else:
# 현재 숫자가 이전과 같은 경우 (중복)
curCount += 1
if curCount == 1:
# 같은 숫자가 처음 중복되는 경우는 허용 (즉, 총 2번까지 허용됨)
l += 1
nums[l] = nums[r] # 허용된 중복을 l 위치에 저장
# curCount > 1인 경우는 아무 처리 없이 건너뜀 (즉, 삭제 효과)
# 배열 index 0부터 시작하므로,
# 수정한 배열개수: l+1 반환
return l + 1 # 중복 제거 후의 배열 길이 반환