어흥

[백준 14725] 개미굴 (C++) 본문

알고리즘/백준

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

라이언납시오 2020. 11. 5. 19:32
728x90
반응형

문제링크: www.acmicpc.net/problem/14725

 

14725번: 개미굴

첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다.  (1 ≤ N ≤ 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이

www.acmicpc.net

1. 주의할 점

- 트리나 트라이에 대해서 알고 있어야 한다

- 사전순으로 출력해야한다(정렬된 무엇인가를 사용)

 

2. 구현

- Node 구조체를 만들어서 해당 Node의 Map을 생성하고, insert()와 print()의 기능을 하는 함수를 생성한다

- Node구조체 형태인 Root 노드를 처음에 만든다

- Insert() 함수는 입력받은 길을 저장하고 있는 V 벡터와 현재 개미굴의 층수를 변수로 받는다. 더 이상 경로가 없다면 Return, 해당 층수에 이미 같은 경로가 저장되어 있다면 다음 경로로 이동하고 마지막으로 해당 층수에 같은 경로가 존재하지 않다면 새로운 Node를 만들어서 Map에 저장한 이후, 다음 경로를 Map에 insert한다

- Print() 함수는 DFS()의 형태로, 해당 층수에 알맞는 먹이를 출력하면 된다

 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;

struct Node{
	map<string, Node*> child;
	map<string, Node*>::iterator iter;
	void insert(vector<string> v, int idx) {
		if (idx == v.size()) return;
		string ss = v[idx];
		iter = child.find(ss);		//Node
		if (iter != child.end()) 		//이미 있는 경우
			iter->second->insert(v, idx + 1);
		else {
			Node* n = new Node;
			child.insert({ ss,n });
			n->insert(v, idx + 1);
		}
	}
	void print(int idx) {
		if (child.empty()) return;
		for (auto it = child.begin(); it != child.end(); it++) {
			for (int i = 0; i < idx; i++)
				cout << "--";
			cout << it->first << '\n';
			it->second->print(idx + 1);
		}
	}
};
Node tmp;
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int num, val;
	Node* root = new Node;
	string ss;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> val;
		vector<string> v;
		for (int j = 0; j < val; j++) {
			cin >> ss;
			v.push_back(ss);
		}
		root->insert(v, 0);
	}
	root->print(0);
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 12781] PIZZA ALVOLOC (C++)  (0) 2020.11.29
[백준 1937] 욕심쟁이 판다 (C++)  (2) 2020.11.09
[백준 13911] 집 구하기 (C++)  (0) 2020.10.29
[백준 1092] 배 (C++)  (4) 2020.10.26
[백준 10216] Count Circle Groups (C++)  (0) 2020.10.20
Comments