[알고리즘 정복] 집합(Set)과 맵(Map) 핵심 요약 (Python & C++)
오늘 공부한 내용은 대량의 데이터에서 **'원하는 정보를 얼마나 빨리 찾느냐'**의 싸움이었습니다. 리스트의 한계를 넘어서는 해시(Hash)와 트리(Tree)의 세계를 정리합니다.
1. 왜 리스트 대신 집합과 맵을 쓰는가?
일반적인 리스트(C의 배열)에서 특정 값을 찾으려면 처음부터 끝까지 뒤져야 합니다(O(N)). 하지만 오늘 배운 자료구조들은 다릅니다.
- 해시 맵/집합: 열쇠(Key)를 주면 즉시 위치를 찾음 (O(1))
- 트리 기반 맵/집합: 이진 탐색을 통해 순식간에 찾음 (O(log N))
2. 주요 문제별 핵심 전략
| 문제 번호 | 핵심 키워드 | 해결 전략 |
| 7785번 (회사에 있는 사람) | 존재 여부 확인 | set(Python) 또는 set<string, greater<string>>(C++)을 사용하여 출입 기록 관리 및 자동 역순 정렬 |
| 1620번 (포켓몬 마스터) | 양방향 매핑 | 이름->번호(map)와 번호->이름(vector)을 동시에 운영하여 양방향 검색 속도 O(1) 달성 |
| 10816번 (숫자 카드 2) | 개수 세기 (Counting) | 파이썬의 Counter 또는 C++의 unordered_map을 활용해 숫자의 출현 빈도를 해시 맵에 저장 |
| 1764번 (듣보잡) | 교집합 연산 | 두 집합의 공통 원소 찾기. 파이썬은 & 연산자, C++은 set_intersection 함수 활용 |
| 1269번 (대칭 차집합) | 합집합 - 교집합 | A ^ B 연산을 통해 양쪽 집합 중 한 곳에만 있는 원소 추출. 메모리 절약을 위해 (A+B) - 2*교집합 공식 활용 가능 |
3. Python vs C++ 자료구조 한눈에 보기
| 기능 | Python | C++ (STL) | 특징 |
| 해시 맵 (중복X) | dict | unordered_map | 정렬은 안 되지만 검색이 매우 빠름 (O(1)) |
| 해시 집합 (값만) | set | unordered_set | 존재 여부 확인의 최강자 (O(1)) |
| 트리 집합 (정렬형) | (없음) | set | 데이터를 넣을 때마다 자동 정렬 유지 (O(log N)) |
4. 오늘 배운 '고급 테크닉'
- unordered_map<int, int> count; count[num]++; C++에서 존재하지 않는 키를 호출하면 자동으로 0으로 초기화해주는 특성을 이용해 개수를 세는 아주 영리한 기법입니다.
- auto 키워드 std::vector<int>::iterator 처럼 복잡한 타입을 컴파일러가 알아서 추론하게 하여 코드의 가독성을 높였습니다.
- 공간과 시간의 트레이드오프 1620번 포켓몬 문제처럼, 메모리를 조금 더 써서(저장소 2개 운영) 검색 시간을 획기적으로 줄이는 전략이 실무(특히 IoT 환경)에서 얼마나 중요한지 배웠습니다.
5. IoT 개발자 지망생의 한마디
센서 데이터가 초당 수천 개씩 쏟아지는 IoT 환경에서 데이터를 리스트로 관리하는 것은 시스템 마비의 지름길입니다. 오늘 배운 해시와 트리 기반의 자료구조를 상황에 맞게 선택하는 능력이 안정적인 시스템 설계의 핵심임을 깨달았습니다.
'코딩테스트 > 백준' 카테고리의 다른 글
| [C/Python] 스택, 큐, 덱 1 (0) | 2026.03.18 |
|---|---|
| [C/Python] 약수, 배수와 소수 2 (0) | 2026.03.16 |
| [C/Python] 정렬 (0) | 2026.03.13 |
| [C/Python] 브루트포스 (0) | 2026.03.12 |
| [C/Python] 시간 복잡도 (0) | 2026.03.08 |