GitHubSeob

C++ / 백준 / 14725 / 개미굴 본문

Baekjoon/Gold

C++ / 백준 / 14725 / 개미굴

GitHubSeob 2023. 8. 26.
문제

 

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