문제 소개
숫자로 이루어진 리스트가 주어졌을 때, 이 리스트 안에 중복된 요소가 존재하는지 확인해야 합니다.
예를 들어, 리스트가 [1, 5, 6, 2, 1, 3]이라면 1이 두 번 등장하므로 결과는 True입니다. 반면 리스트가 [1, 2, 3, 4]라면 중복된 값이 없으므로 결과는 False가 됩니다.
해결 아이디어
이 문제는 집합(set) 자료구조의 특성을 활용하면 간단하게 해결할 수 있습니다.
집합은 중복을 허용하지 않는 자료구조입니다. 즉, 동일한 값을 여러 번 저장하려고 해도 하나만 유지됩니다. 반면 리스트는 중복 값을 그대로 저장합니다.
따라서 다음과 같은 논리로 접근할 수 있습니다:
- 리스트를 집합으로 변환한다.
- 중복 요소가 있었다면 집합의 크기가 원래 리스트보다 작아진다.
- 두 길이를 비교하여 다르면 중복이 존재한다고 판단한다.
구현 예제
아래 코드는 위 접근 방식을 실제로 구현한 것입니다.
class Solution(object):
def containsDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
return not len(nums) == len(set(nums))
ob1 = Solution()
print(ob1.containsDuplicate([1,5,6,2,1,3]))
print(ob1.containsDuplicate([1,2,3,4]))입력
nums = [1,5,6,2,1,3] nums = [1,2,3,4]
출력
True False
동작 원리 설명
핵심 코드인 return not len(nums) == len(set(nums))를 살펴보겠습니다.
set(nums): 리스트를 집합으로 변환하여 중복을 제거합니다.len(nums) == len(set(nums)): 원본 리스트와 집합의 길이가 같다면 중복이 없다는 의미입니다.not: 중복이 없으면False, 중복이 있으면True를 반환하도록 뒤집습니다.
첫 번째 입력 [1,5,6,2,1,3]은 집합으로 변환 시 {1, 5, 6, 2, 3}이 되어 길이가 6에서 5로 줄어들기 때문에 True가 출력됩니다. 두 번째 입력 [1,2,3,4]는 변환 후에도 길이가 그대로 4이므로 False가 출력됩니다.
시간 복잡도
집합 변환 연산은 평균적으로 O(n)의 시간 복잡도를 가지므로, 전체 알고리즘의 시간 복잡도는 O(n)입니다. 공간 복잡도 역시 집합 저장을 위해 최악의 경우 O(n)이 필요합니다.