
듣보잡(백준 1764번) 문제를 풀던 중, 단순 배열 비교에서 시간 초과가 발생했다.
문제의 원인은 includes()와 filter를 사용했기 때문이었다.
이 경우 시간 복잡도는 O(N * M) 정도로 커지고, 최대 입력이 (N, M ≤ 500,000)일 경우 2.5억 번 이상 비교가 발생해서 시간 초과가 발생한다.
따라서 set과 has()를 이용하여 코드를 수정하였다.
// 느린 방식 (시간 초과 가능성)
arr1.filter(x => arr2.includes(x)); // O(N * M)
// 빠른 방식
const set2 = new Set(arr2);
arr1.filter(x => set2.has(x)); // O(N)
.has() 로 존재 여부 확인 가능 (해시 테이블 기반).has(key) / .get(key) 존재 여부 확인 가능Set보다 메모리 사용량 ↑Set보다 비효율적.includes()는 O(N) 시간 복잡도| 목적 | 배열(Array) | Set | Map |
|---|---|---|---|
| 순서 유지 | ✅ | 🔸 (삽입 순서 유지되지만 권장 X) | 🔸 |
| 중복 허용 | ✅ | ❌ | ✅ (Key는 고유) |
| 존재 여부 검사 | ❌ O(N) .includes() | ✅ O(1) .has() | ✅ O(1) .has(key) |
| 키-값 구조 필요 | ❌ | ❌ | ✅ |
| 반복적 존재 여부 검사 | ❌ 비효율적 | ✅ 가장 적합 | ✅ 가능하지만 무거움 |
| 값만 저장할 때 | ✅ | ✅ 가장 경량 | ❌ 낭비 |
SetArrayMap