Lesson 1강 · 개념 — 집합과 맵, 정렬 기반 vs 해시 기반
집합과 맵이란
- 집합(set) — 중복 없이 원소를 담고, "이 값이 있나?"를 빠르게 답한다.
- 맵(map, dictionary) — 키 → 값 대응을 저장하고, 키로 값을 빠르게 찾는다.
두 구조 모두 삽입, 삭제, 검색을 핵심 연산으로 하며, 구현 방식에 따라 복잡도가
갈립니다.
| 구현 | 삽입/삭제/검색 | 순서 유지 | 대표 |
|---|---|---|---|
| 균형 이진 탐색 트리 | \(O(\log N)\) | 정렬 순서 | C++ set/map, Java TreeMap |
| 해시 테이블 | 평균 \(O(1)\), 최악 \(O(N)\) | 없음 | C++ unordered_set/map, 파이썬 set/dict |
불변식(정렬 기반): 원소가 항상 정렬된 상태로 유지되므로, "\(x\) 이상 가장 작은
값"(lower_bound) 같은 순서 질의가 \(O(\log N)\)에 가능하다.
불변식(해시 기반): 순서는 보장되지 않지만, 존재 여부·키 조회가 평균 상수.
언제 무엇을 쓰나
- 존재 여부, 중복 제거, 빈도수 — 순서가 필요 없으면 해시 기반(가장 빠름).
- "\(x\)보다 큰 가장 작은 원소", 정렬 순회, 범위 질의 — 정렬 기반(BBST).
- 키가 정수이고 범위가 작다 — 그냥 배열이 가장 빠릅니다(맵 불필요).
- 키가 큰 정수/문자열/좌표 — 맵 또는 좌표 압축.
"봤던 값인지 빠르게 확인", "무언가를 세다", "키로 찾다"가 신호입니다.
워크드 예제 — 빈도수 세기
배열 [2, 3, 2, 5, 3, 2]에서 각 값의 등장 횟수를 맵으로 셉니다. 값을 하나씩
보며 cnt[값] += 1:
| 처리 값 | 맵 상태 |
|---|---|
| 2 | {2:1} |
| 3 | {2:1, 3:1} |
| 2 | {2:2, 3:1} |
| 5 | {2:2, 3:1, 5:1} |
| 3 | {2:2, 3:2, 5:1} |
| 2 | {2:3, 3:2, 5:1} |
최종적으로 2는 3번, 3은 2번, 5는 1번. 이렇게 맵은 "키별 누적"을 자연스럽게
표현합니다. 존재 여부만 필요했다면 값을 버리고 집합을 썼을 것입니다.
다음 강의에서 언어별 API와 정렬 기반의 순서 질의, 좌표 압축을 다룹니다.