혼종 꼬지마루
[SWEA] 1257 - K번째 문자열 본문
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18KWf6ItECFAZN
(이 글이 문제가 될 시 삭제하도록 하겠습니다.)
이 문제도 K번째 접미어 처럼 TRIE로 풀면 된다.
TRIE를 사용하는 이유는 입력과 동시에 자동으로 정렬하는 효과를 볼 수 있기 때문이다.
순회하며 순서대로 탐색하기 때문이다.
일단 입력되는 문자열을 TRIE로 만들어 준다.
순회하며 처음 방문하는 node에 check를 하며 갯수를 세준다.
이때 중복되는, 문제에서 처럼 food 의 경우는 o가 두번 나오게 되는데 node에 check 변수를 넣어주는 이유는 이 중복을 제거하기 위해서이다.
따라서 현재 방문한 노드에 check가 false라면 갯수를 카운트 하지만, 아니라면 다음 노드를 검색해서 들어가는 것으로 중복을 제거할 수 있다.
이것도 순회하며 탐색할 때 vector로 push와 pop을 해주며 dab을 뽑아냈다.
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 <malloc.h> #include <vector> #include <cstring> using namespace std; typedef struct NODE { bool check; NODE * next[27]; }node; int T, K, cnt, flag; vector<char> dab; node* makenode() { node* tmp = (node*)malloc(sizeof(node)); for (int i = 0; i < 27; i++) tmp->next[i] = 0; tmp->check = false; return tmp; } void insert(node*root, char *buff, int st, int ed) { node *tmp = root; if (st == ed) return; if (!tmp->next[buff[st] - 'a']) tmp->next[buff[st] - 'a'] = makenode(); insert(tmp->next[buff[st] - 'a'], buff, st + 1, ed); } void find(node *root) { node *tmp = root; if (cnt == K) { flag = 1; return; } for (int i = 0; i < 27; i++) if (tmp->next[i]) { dab.push_back(i + 'a'); if (!tmp->next[i]->check) cnt++; find(tmp->next[i]); if (flag) return; dab.pop_back(); } } void delnode(node* root) { node*tmp = root; for (int i = 0; i < 27; i++) if (tmp->next[i]) delnode(tmp->next[i]); free(tmp); } int main(void) { cin >> T; for (int tc = 1; tc <= T; tc++) { char arr[402]; while (!dab.empty()) dab.pop_back(); cnt = flag = 0; cin >> K >> arr; int len = strlen(arr); node *root = makenode(); for (int i = 0; i < len; i++) insert(root, arr, i, len); find(root); delnode(root); cout << "#" << tc << " "; if (dab.size()) { for (int i = 0; i < dab.size(); i++) cout << dab[i]; cout << endl; } else cout << "none" << endl; } return 0; } | cs |
'Algorithms > TRIE' 카테고리의 다른 글
[백준] 1764 - 듣보잡 (0) | 2019.06.02 |
---|---|
[SWEA] 1256 - K번째 접미어 (0) | 2018.11.11 |
[SWEA] 3135 - 홍준이의 사전놀이 (0) | 2018.09.03 |
[백준] 5052 - 전화번호 목록 (0) | 2018.08.26 |
[백준] 9934 - 완전 이진 트리 (0) | 2018.08.26 |