코딩테스트[파이썬]/입문자를 위한 코딩테스트 핵심

[배열과 연결리스트와 덱] - 중복제거-

softmoca__ 2024. 1. 22. 13:15
목차

중복제거

오름차순으로 정렬된 수열이 주어지면 중복된 값을 제거하고 유일값으로 구성된 내림차순 수 열을 만들고 싶습니다.
매개변수 nums에 길이가 n인 수열이 주어지면 중복된 값을 제거하고 유일값만으로 구성된 내 림차순 수열을

배열에 담아 반환하는 프로그램을 작성하세요

 

 

제한사항:
• nums의 길이 3 <= n <= 200,000
• 배열 nums의 원소는 정수입니다. -10,000 <= nums[i] <= 10,000

 

나의코드

def solution(nums):
    arr=[]
    arr.append(nums[0])
    for i in range(1,len(nums)):
        if nums[i]!=arr[-1]:
            arr.append(nums[i])
    arr.sort(reverse=True)
    
    return arr
    
   
print(solution([0, 1, 1, 1, 2, 2, 2, 3]))
print(solution([1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5]))
print(solution([0, 0, 0, 3, 3, 3, 5, 7, 7, 7]))
print(solution([1, 2, 3, 4, 5, 6, 7, 7, 7, 8, 9]))

 

처음엔 arr 배열을 생성하지 않고 처음 입력된 nums 의 i번째 원소와 다음 i+1의 원소를 비교하여 같으면 pop을 하려 하였는데

생각 처럼 로직이 굴러 가지 않아 nums 원소를 하나씩 순회하며 arr 원소에 있는지 확인하며 없으면 추가 하는 코드로 변경.

 

 

정답코드

from collections import deque
def solution(nums):
    answer = deque()
    answer.appendleft(nums[0])
    for i in range(1, len(nums)):
        if nums[i-1] != nums[i]:
            answer.appendleft(nums[i])
    return list(answer)
    
   
print(solution([0, 1, 1, 1, 2, 2, 2, 3]))
print(solution([1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5]))
print(solution([0, 0, 0, 3, 3, 3, 5, 7, 7, 7]))
print(solution([1, 2, 3, 4, 5, 6, 7, 7, 7, 8, 9]))

 

정답코드에서는  나의 코드의 마지막줄 sort를 사용하지 않고 deque를 사용 하여 구현하였다.

전반적인 로직은 같으나 deque을 써서 불필요한 sort를 안써도 되서 더 좋은 코드 같다.