트라이 (Trie)
한눈에 보기
문자를 경로로 삼아 문자열 집합을 저장하는 접두사 트리인 트라이를 다룬다. O(m) 탐색 원리, 해시 테이블과의 비교, 자동 완성 활용과 메모리 트레이드오프까지 정리했다.
최종 업데이트 2026.09.17
트라이(Trie)는 문자열의 각 문자를 트리의 간선처럼 취급해, 루트에서 특정 노드까지의 경로가 하나의 접두사(prefix)를 이루도록 문자열 집합을 저장하는 트리 자료구조다. 트라이는 문자열의 길이를 m이라 할 때 저장된 단어 수와 무관하게 O(m)에 탐색과 삽입을 처리하며, 공통 접두사를 한 번만 저장하므로 자동 완성(autocomplete)과 사전 검색에 특히 강하다. 이름은 검색을 뜻하는 retrieval에서 왔으며 접두사 트리(prefix tree)라고도 부른다.
구조와 저장 원리
트라이의 루트는 빈 문자열을 나타내고, 각 노드는 문자별 자식 노드 참조와 "여기서 끝나는 단어가 있다"는 단어 끝 표시(end of word flag)를 가진다. 예를 들어 "car", "card", "care"를 넣으면 c, a, r로 이어지는 경로 하나가 만들어지고, r 노드에 끝 표시가 붙은 뒤 d와 e가 각각 자식으로 갈라진다. 세 단어가 공유하는 "car" 부분은 한 번만 저장되는 것이다.
끝 표시가 필요한 이유는 "card"를 저장했을 때 경로상에 존재하는 "car"가 실제로 등록된 단어인지 구분해야 하기 때문이다. 완전 일치 검색은 경로를 끝까지 따라간 뒤 끝 표시까지 확인해야 성공이고, 접두사 검색은 경로가 존재하기만 하면 성공이다.
시간 복잡도와 공간 트레이드오프
| 연산 | 트라이 | 해시 테이블 | 정렬된 배열 |
|---|---|---|---|
| 단어 삽입 | O(m) | 평균 O(m) | O(n m) |
| 완전 일치 검색 | O(m) | 평균 O(m) | O(m log n) |
| 접두사로 시작하는 단어 존재 확인 | O(m) | 지원 어려움 | O(m log n) |
| 사전순 전체 순회 | O(전체 문자 수) | 불가 | O(n) |
m은 대상 문자열의 길이, n은 저장된 단어 수다. 해시 테이블도 문자열 하나의 조회는 해시 계산에 O(m)이 들므로 속도는 비슷하지만, 접두사 질의는 흉내낼 수 없다는 것이 결정적 차이다. 트라이는 저장된 단어가 아무리 많아도 검색 시간이 단어 길이에만 비례한다는 점도 중요하다.
약점은 메모리다. 노드마다 알파벳 수만큼의 자식 배열(영소문자면 26칸)을 두면 대부분이 널(null)로 낭비된다. 자식을 해시맵으로 들면 공간은 아끼지만 상수 비용이 커진다. 자식이 하나뿐인 사슬 구간을 문자열 조각으로 압축한 래딕스 트리(radix tree)는 이 낭비를 줄인 변형으로, 라우터의 IP 경로 테이블이나 HTTP 라우팅에 쓰인다.
코드 예시
다음은 영어 소문자를 다루는 트라이의 삽입과 접두사 검색 자바(Java) 구현이다.
class Trie {
static class Node {
Node[] children = new Node[26];
boolean isEnd;
}
Node root = new Node();
void insert(String word) {
Node cur = root;
for (char c : word.toCharArray()) {
int i = c - 'a';
if (cur.children[i] == null) cur.children[i] = new Node();
cur = cur.children[i];
}
cur.isEnd = true;
}
boolean startsWith(String prefix) {
Node cur = root;
for (char c : prefix.toCharArray()) {
cur = cur.children[c - 'a'];
if (cur == null) return false;
}
return true; // 완전 일치라면 cur.isEnd까지 확인한다
}
}
활용 사례
가장 대표적인 활용은 자동 완성이다. 사용자가 입력한 접두사까지 경로를 따라 내려간 뒤 그 아래 부분 트리를 순회하면 해당 접두사로 시작하는 모든 후보를 얻는다. 검색어 추천, 사전 앱, IDE의 코드 완성이 이 원리다. 맞춤법 검사와 금칙어 필터링에도 쓰이며, 여러 패턴을 동시에 찾는 아호 코라식(Aho-Corasick) 알고리즘은 트라이에 실패 링크를 더한 확장이다. 문자 대신 비트를 간선으로 쓰는 이진 트라이는 XOR 최댓값 문제나 IP 주소의 최장 접두사 매칭(longest prefix matching)에 활용된다. 코딩 테스트에서는 "문자열 집합에서 접두사 관계 판정", "검색어 자동 완성 구현" 유형이 트라이 문제의 전형이다.
다른 구조와의 선택 기준
완전 일치 조회만 필요하면 구현이 간단하고 메모리 효율이 좋은 해시 테이블이 낫다. 접두사 질의, 사전순 순회, 공통 접두사 압축이 필요할 때 트라이가 정답이 된다. 데이터가 정적이고 메모리가 빠듯하면 정렬된 배열 위에서 이진 탐색으로 접두사 범위를 찾는 절충안도 실무에서는 유효하다. 결국 "접두사"라는 단어가 요구사항에 등장하는 순간 트라이를 떠올리는 것이 올바른 감각이다.
면접에서 이렇게 물어본다
- 트라이의 구조를 설명하고, 검색 시간이 저장된 단어 수와 무관한 이유를 말해 보라.
- 트라이와 해시 테이블의 장단점을 비교하고 트라이를 선택해야 하는 상황을 들어 보라.
- 노드에 단어 끝 표시가 필요한 이유를 예를 들어 설명해 보라.
- 자동 완성 기능을 트라이로 설계하는 과정을 설명해 보라.
- 트라이의 메모리 낭비 문제와 이를 완화하는 방법을 설명해 보라.
자료구조에서 같이 읽기
- 배열 (Array)같은 타입의 데이터를 연속 메모리에 저장하는 기본 선형 자료구조인 배열을 다룬다. O(1) 인덱스 접근의 원리, 연산별 시간 복잡도, 동적 배열의 확장과 분할 상환 분석, 캐시 지역성까지 정리했다.
- Array vs ArrayList vs LinkedList배열, ArrayList, LinkedList의 내부 저장 방식과 연산별 시간 복잡도를 비교한다. 캐시 지역성 때문에 실무에서 ArrayList가 유리한 이유와 상황별 선택 기준을 정리했다.
- AVL 트리와 레드 블랙 트리 (AVL Tree & Red-Black Tree)자가 균형 이진 탐색 트리인 AVL 트리와 레드 블랙 트리를 비교한다. 균형 인수와 회전, 탐색과 삽입 비용, TreeMap이 레드 블랙 트리를 쓰는 이유를 정리했다.
- B 트리와 B+ 트리 (B-Tree & B+ Tree)한 노드에 여러 키를 담아 높이를 낮춘 B 트리와 리프에 데이터를 모아 연결한 B+ 트리를 다룬다. 디스크 I/O 최소화 원리와 데이터베이스 인덱스가 B+ 트리를 쓰는 이유를 정리했다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기