본문 바로가기

Study

트라이(Trie)

트라이 구조는 문자열을 처리하는 알고리즘으로, 여러 문자열을 트리 구조를 활용하여 빠르게 처리하는 자료 구조이다.

 

맵을 사용한 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Node {
    map< char, Node* > nxt;
    bool end;
    
    Node() {
        nxt.clear();
        end = false;
    }
    
    void insert(char *val) {
        if(*val == '\0'end = true;
        else {
            if(!nxt[*val]) nxt[*val] = new Node();
            nxt[*val]->insert(val+1);
        }
    }
};
cs

 

포인터를 사용한 구현

기준 문제 : https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <algorithm>
#define NMAX 15
using namespace std;
 
 
struct Node {
    Node *child[NMAX];
    bool end, isChild;
    
    Node() {
        fill(child, child+NMAX, nullptr);
        end = isChild = false;
    }
    
    ~Node() {
        for(int i=0;i<NMAX;i++delete child[i];
    }
    
    // 노드 추가 및 일관성 확인
    // 일관성이 있다: 모든 노드가 말단 노드에서 끝난다.
    // >> (end == true) and (isChild == false)
    bool insert(char* val) {
        if(*val == '\0') {
            end = true;
            
            // 자식의 유무로 일관성 판별 가능
            return !isChild;
        }
        else {
            int nxt = *val - '0';
            if(!child[nxt]) child[nxt] = new Node();
            
            isChild = true;
            
            // 일관성 판별하기
            return (!end and child[nxt]->insert(val+1));
        }
    }
};
 
int T, N;
char tel[NMAX];
 
int main() {
    scanf("%d"&T);
    while(T--) {
        scanf("%d"&N);
        
        bool ret = true;
        Node *root = new Node();
        for(int i=1;i<=N;i++) {
            scanf("%s", tel);
            
            ret = (ret & root->insert(tel));
        }
        
        printf(ret ? "YES\n":"NO\n");
        
        delete root;
    }
}
 
cs

 

'Study' 카테고리의 다른 글

가우스 소거법  (1) 2023.10.31
느리게 갱신되는 세그먼트 트리  (1) 2023.10.09
FFT  (0) 2023.03.26
이분 매칭(소스코드)  (0) 2023.03.09
KMP 알고리즘  (0) 2022.08.13