GitHubSeob
C++ / 백준 / 14725 / 개미굴 본문
문제 |
https://www.acmicpc.net/problem/14725
14725번: 개미굴
첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N (1 ≤ N ≤ 1000)개가 주어진다. 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이 정
www.acmicpc.net
문제풀이 |
트라이 문제이다.
입력으로는 알파벳 대문자로만 이루어진 string이 들어온다.
트라이는 map을 이용하여 자녀 트라이를, 깊이를 나타내는 depth, 문자열의 끝 여부를 나타내는 isEnd로 구성하였다.
void insert(vector<string>& v) {
Trie* now = this;
for (int idx = 0; idx < v.size(); ++idx) {
if (now->child.find(v[idx]) == now->child.end()) {
now->child[v[idx]] = new Trie();
}
now->child[v[idx]]->depth = now->depth + 1;
now = now->child[v[idx]];
if (idx + 1 == v.size()) now->isEnd = true;
}
}
문자열을 입력하는 함수이다.
루트 트라이부터 시작하여 문자열 벡터를 탐색한다.
자녀 트라이에 해당 문자열이 없다면 새로 자녀 트라이를 생성한다.
자녀 트라이의 깊이는 부모 트라이의 깊이 +1로 설정한다.
그다음 현재 위치를 자녀 트라이로 이동한다.
현재 문자열이 끝이라면 isEnd를 true로 바꾼다.
void print() {
Trie* now = this;
for (auto iter = now->child.begin(); iter != now->child.end(); ++iter) {
for (int idx = 0; idx < now->depth; ++idx) cout << "--";
cout << iter->first << '\n';
iter->second->print();
}
}
루트 트라이부터 시작하여 모든 자녀의 트라이를 탐색한다.
해당 트라이의 깊이만큼 "--"를 출력한 뒤, 현재 문자열을 출력한다.
그다음 자녀 트라이로 이동하여 반복한다.
코드 |
#include <bits/stdc++.h>
using namespace std;
struct Trie {
map<string, Trie*> child;
int depth;
bool isEnd;
Trie() : child(), depth(0), isEnd(false) {}
void insert(vector<string>& v) {
Trie* now = this;
for (int idx = 0; idx < v.size(); ++idx) {
if (now->child.find(v[idx]) == now->child.end()) {
now->child[v[idx]] = new Trie();
}
now->child[v[idx]]->depth = now->depth + 1;
now = now->child[v[idx]];
if (idx + 1 == v.size()) now->isEnd = true;
}
}
void print() {
Trie* now = this;
for (auto iter = now->child.begin(); iter != now->child.end(); ++iter) {
for (int idx = 0; idx < now->depth; ++idx) cout << "--";
cout << iter->first << '\n';
iter->second->print();
}
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N(0), K(0);
cin >> N;
Trie* trie = new Trie();
for (int idx = 0; idx < N; ++idx) {
cin >> K;
vector<string>words(K, "");
for (int idx2 = 0; idx2 < K; ++idx2) {
cin >> words[idx2];
}
trie->insert(words);
}
trie->print();
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 1766 / 문제집 (0) | 2023.08.29 |
---|---|
C++ / 백준 / 2252 / 줄 세우기 (0) | 2023.08.29 |
C++ / 백준 / 13975 / 파일 합치기 3 (0) | 2023.07.07 |
C++ / 백준 / 8980 / 택배 (0) | 2023.07.06 |
C++ / 백준 / 2812 / 크게 만들기 (0) | 2023.07.05 |