01. Contains Duplicate
Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.
[질문하기]
- 입력 배열의 길이 제한은 어떻게 되나요? 1 <= nums.length <= 10^5
- 숫자의 범위는 어떻게 되나요? -10^9 <= nums[i] <= 10^9
- 입력 배열이 정렬되어 있나요? NO
- 빈 배열이 입력으로 올 수 있나요? 만약 그렇다면, false를 return 해야 하나요? YES
- 모든 요소가 대부분 유일한가요? 중복이 많은가요? → 시간 복잡도를 우선할 것인지 공간 복잡도를 우선할 것인지 선택 가능
[아이디어]
특정 원소의 존재 여부를 빠르게 확인할 수 있는 자료구조는? set, hash
[풀이 1] set
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
numSet = set()
for num in nums:
if num in numSet:
return True
numSet.add(num)
return False
set, hash 등이 원소 탐색에 O(1)의 시간 복잡도를 보이기 때문에, 시간 복잡도를 줄이기 위해 위의 방식으로 문제를 풀 수 있다.
또, 원소에 중복이 많다면 Early Exit이 가능하므로 유리하다.
⏱️ 시간복잡도
nums 리스트의 모든 원소를 한 번씩 순회하고, set 자료구조의 경우 탐색에 걸리는 시간 복잡도가 O(1)이므로 전체 시간 복잡도는 O(n)이다.
🧠 공간복잡도
최악의 경우 nums 리스트의 모든 원소를 저장해야 하기 때문에 공간복잡도는 O(n)이다.
[풀이 2] sort
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
nums.sort()
for i in range(1, len(nums)):
if nums[i] == nums[i - 1]:
return True
return False
공간 복잡도가 우선일 경우, 혹은 in-place로 문제를 풀이해야 할 경우는 정렬 O(nlogn) 후에 인접 비교 방식을 사용할 수 있다.
또, 원소가 대부분 유일하다면, Full Scan을 해야 하므로 공간에 제약이 있는 경우 유리하다.
⏱️ 시간복잡도
정렬을 하기 때문에 시간 복잡도는 O(nlogn)이다.
🧠 공간복잡도
Python의 sort()의 경우 in-place 정렬인 Timsort를 사용하기 때문에 공간복잡도는 O(1)이다.
※ sorted()의 경우 새 리스트를 만들어 반환하기 때문에 O(n)이 필요하다.
'자료구조와 알고리즘' 카테고리의 다른 글
[DSA][Array & Hashing] 03. Two Sum (0) | 2025.05.17 |
---|---|
[DSA][Array & Hashing] 02. Valid Anagram (0) | 2025.05.16 |
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Adaptors (0) | 2023.05.17 |
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Unordered Associative (0) | 2023.05.06 |
Certi Pro 취득을 위해 꼭 알아야 할 STL Container : Associative (1) | 2023.04.12 |
댓글