혼종 꼬지마루
[백준] 5052 - 전화번호 목록 본문
이 문제는 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 |