코딩 공부/백준

[백준][C++] 14725 개미굴

김 정 환 2021. 1. 27. 18:59
반응형

 

 

 

알고리즘 종류

    - 문자열

    - 트라이(Trie)

 

 

 

사고 과정

    - 보아하니 트리를 구현하여 문자열을 저장하면 될 것 같았다. 이진트리만 만들어 봤지 어떻게 만들지 고민했다. 트리 종류를 찾아보니 트라이(Trie)라는 것이 문자열을 저장하는데 효과적인 자료구조라는 것을 알게 되었다. 트라이를 이용해서 해결하는 문제였다. 

    - 트라이를 공부할 필요성이 생겼다. 여기에 적어보았다.

 

    - 입력된 문자열을 vector에 담아 주고, vector를 이용해서 트리를 만들어 준다.

    - 완성된 트리에서 DFS를 실행하여 출력하면 알파벳 순으로 출력됩니다. map는 key를 기준으로 오름차순 정렬을 자동으로 합니다. 따라서, key는 string이므로 알파벳 순으로 자동 정렬됩니다.

 

 

 

구현(C++)

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
#include <vector>
#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
 
struct Node {
    map<string, Node> child;
};
 
 
 
void insert(Node &p, vector<string> v, int idx) {
    // idx는 string을 담은 vector에서의 현재 위치입니다.
    // idx가 vector의 끝에 도달하면 끝냅니다.
    if (idx == v.size()) return;
 
    // vector에서 가져온 string이 트리에 있는지 count()로 확인합니다.
    // 없으면, 0이 나옵니다. 따라서 key를 string으로 하는 node를 만들어 줍니다.
    if (!p.child.count(v[idx]))
        p.child[v[idx]] = Node();
 
    // 노드를 타고 들어갑니다.
    insert(p.child[v[idx]], v, idx + 1);
}
 
 
void print(Node &p, int depth = 0) {
    // 어느 깊이에 있는 모든 노드들을 가져옵니다.
    for (auto node : p.child) {
        for (int i = 0; i<depth; i++) {
            cout << "--";
        }
        cout << node.first << endl;
 
        // DFS이므로 깊이 순으로 타고 들어갑니다.
        print(node.second, depth + 1);
    }
 
}
 
 
int main(void) {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    Node root;
 
    int n;
    cin >> n;
 
    for (int i = 0; i<n; i++) {
        int k;
        cin >> k;
 
        vector<string> v(k);
 
        for (int j = 0; j<k; j++) {
            cin >> v[j];
        }
        insert(root, v, 0);
    }
 
    print(root);
 
}
 
 
cs

 

 

 

시행착오

    - 이렇게 문자열 자료구조를 하나 더 배우게 되었습니다.

    - 포인터 사용법을 잊어버려서 고생 좀 했습니다.

 

 

 

 

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 10159 저울  (0) 2021.01.28
[백준][C++] 1261 알고스팟  (0) 2021.01.28
[백준][Python] 1958 LCS 3  (0) 2021.01.27
[백준][C++] 2636 치즈  (0) 2021.01.26
[백준][C++] 1005 ACM Craft  (0) 2021.01.25