[문제풀이] 5052번: 전화번호 목록
https://www.acmicpc.net/problem/5052
문제유형
TRIE
Solution
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <stdio.h> #include <malloc.h> typedef struct tn { int word; struct tn* child[10]; }NODE; NODE root; char str[10001][10 + 10]; char search_str[10 + 10]; int insert_node(char* str) { int i, num; NODE* cur = &root; NODE* p; for (i = 0; str[i]; i++) { num = str[i] - '0'; if (cur->child[num] == 0) { p = (NODE*)calloc(1, sizeof(NODE)); if (!p) return 0; //코드검사용 동적할당받을 때 체크해라 cur->child[num] = p; } cur = cur->child[num]; } cur->word = 1; return 1; } int search_string(char* str) { NODE* cur = &root; int i, num; for (i = 0; str[i]; i++) { if (cur->word == 1) return 0; num = str[i] - '0'; if (cur->child[num] == 0) return 0; cur = cur->child[num]; } return cur->word; } void print_node(NODE* node, int n) { int i; if (node != 0 && node->word == 1) { printf("%s\n", search_str); //문자열의 마지막에 도달하면 출력. } if (node == 0) return; for (i = 0; i < 10; i++) { if (node->child[i]) { search_str[n] = i + '0'; search_str[n + 1] = 0; //출력문자를 SEARCH_STR에 저장하고 매번 N+1에 0으로 끝문자를 넣어주자. print_node(node->child[i], n + 1); } } } void delete_node(NODE* node) { int i; for (i = 0; i < 10; i++) { if (node->child[i]) { delete_node(node->child[i]); free(node->child[i]); node->child[i] = 0; } } } int main() { int t, n, i, flag = 0; scanf("%d", &t); while (t--) { scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%s", str[i]); insert_node(str[i]); } flag = 0; for (i = 0; i < n; i++) { int sol = search_string(str[i]); if (sol == 0) { flag = 1; break; } } if (flag) printf("NO\n"); else printf("YES\n"); delete_node(&root); } return 0; } | cs |
'한국으로 > 알고리즘 문제풀이' 카테고리의 다른 글
[문제풀이] 1406번: 에디터 (0) | 2018.07.05 |
---|---|
[문제풀이] 2776번: 암기왕 (0) | 2018.07.04 |
[문제풀이] 1966번: 프린터 큐 (0) | 2018.07.04 |
[문제풀이] 5926번: Cow Lineup (0) | 2018.07.04 |
[문제풀이] 1395번: 스위치 (0) | 2018.07.04 |
[문제풀이] 14706번: 구간 합 최대 (0) | 2018.07.04 |
[문제풀이] 7432번: 디스크 트리 (0) | 2018.07.04 |
[문제풀이] 6593번: 상범 빌딩 (0) | 2018.07.04 |