Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[백준] 5052 - 전화번호 목록 본문

Algorithms/TRIE

[백준] 5052 - 전화번호 목록

꼬지마루 2018. 8. 26. 13:54

이 문제는 TRIE를 구현해서 모든 전화번호를 입력시킨 후, 하나하나 비교하면서 탐색주시면 됩니다.

 

전화번호 입력과 동시에 TRIE에 입력시켜 주고, 각 전화번호가 모두 포함되어 있다면 NO, 하나라도 포함되어 있지 않고 모두 다르다면 YES

 

이 문제를 풀면서 TRIE를 제대로 이해할 수 있었고, 구현까지 익힐 수 있었던 문제입니다.

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
 
typedef struct NODE {
    struct NODE *next[12];
    int end;
    NODE() : next(), end(0) {};
}node;
 
node *makenewnode()
{
    node *newnode = (node*)malloc(sizeof(node));
    for (int i = 0; i < 10; i++)
        newnode->next[i] = 0;
    newnode->end = 0;
    return newnode;
}
 
bool push(node **origin, char *arr)
{
    int len = strlen(arr);
    node *tmp = *origin;
 
    for (int i = 0; i < len; i++)
    {
        if (!tmp->next[arr[i] - '0'])
        {
            if (tmp->end) return false;
            tmp->next[arr[i] - '0'= makenewnode();
        }
        tmp = tmp->next[arr[i] - '0'];
    }
 
    tmp->end = 1;
    for (int i = 0; i < 10; i++)
    {
        if (tmp->next[i]) return false;
    }
    return true;
}
 
void delnode(node * origin)
{
    node *pre = origin;
    for (int i = 0; i < 10; i++)
        if (pre->next[i])
            delnode(pre->next[i]);
    delete pre;
    return;
}
 
int main(void)
{
    int T, N;
    cin >> T;
    while (T--)
    {
        cin >> N;
        char arr[10005][12];
        for (int i = 0; i < N; i++)
            cin >> arr[i];
        bool check = true;
        node *origin = makenewnode();
        for (int i = 0; i < N; i++)
        {
            check = push(&origin, arr[i]);
            if (!check) break;
        }
 
        if (check) cout << "YES" << endl;
        else cout << "NO" << endl;
        delnode(origin);
    }
    return 0;
}
cs

 

'Algorithms > TRIE' 카테고리의 다른 글

[백준] 1764 - 듣보잡  (0) 2019.06.02
[SWEA] 1257 - K번째 문자열  (0) 2018.11.11
[SWEA] 1256 - K번째 접미어  (0) 2018.11.11
[SWEA] 3135 - 홍준이의 사전놀이  (0) 2018.09.03
[백준] 9934 - 완전 이진 트리  (0) 2018.08.26