"배열은 즉시 접근을 줘 — 근데 정수 인덱스를 알아야만. 해싱이 물어: 어떤 키든 — 이름, 단어, 튜플 — 자기 자신의 인덱스가 될 수 있다면? 그 질문이 구조 전부야."
꿈
배열의 arr[i] 는 i 가 주소를 바로 알려줘서 O(1) 이야. 근데 네 키는 깔끔한 정수인 경우가 드물어 — 사용자명, 단어, ID, 좌표야. "이 사용자명 쓰였나?" 를 리스트에서 검색하면 O(n). 사용자명 자체를 배열 인덱스로 바꿔 arr[i] 처럼 그 슬롯으로 곧장 점프할 수 있다면? 그게 해시맵이 주는 꿈이야.
트릭: 해시 함수
해시 함수는 어떤 키든 받아 결정론적으로 숫자 — 그 해시 — 를 만들어. 그 숫자를 테이블 크기로 modulo 하면 배열 인덱스가 나와. 이제: 키를 저장하려면, 해시해서 인덱스를 얻고 그 슬롯에 떨궈. 조회하려면, 다시 해시해서 같은 인덱스를 얻고 그 슬롯을 읽어. 검색 없음 — 어디 사는지 정확히 계산했어. 두 연산 다 평균 O(1): 해시 계산 한 번 + 배열 접근 한 번.
밑에서, 해시맵은 그냥 배열이야. 해싱은 임의 키가 그 배열의 정수 인덱스처럼 행동하게 하는 어댑터야. 배열 접근이 왜 즉시인지는 이미 알아 (Arrays 트랙의 주소 산술); 해싱은 그 선물을 정수에서 해시 가능한 모든 것으로 확장할 뿐이야.
넌 이걸 끊임없이 써
Python 의 dict 와 set 이 해시맵이고, 아마 프로그래밍 전체에서 가장 많이 쓰이는 사소하지 않은 자료구조야. "이거 전에 봤나?" → set. "이 키의 값이 뭐야?" → dict. "각 단어가 몇 번 나와?" → dict. 이 퀘스트 앞에서 O(n) in list 를 O(1) in set 으로 바꿀 때마다, 그걸 즉시로 만든 게 이 기계장치야. 면접용으로 배우는 이국적 구조가 아니라 — 매일 손이 가는 일꾼이야.
피파의 고백
dict 랑 set 이 내가 제일 먼저 손대는 도구고, '이 조회를 O(n) 훑기 대신 O(1) 해시로 만들 수 있나?' 가 내가 쓰는 거의 모든 반복문에 돌리는 반사신경이야.