※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2379번 문제인 트리 탐색하기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2379 

 

2379번: 트리 탐색하기

n개의 정점으로 이루어진 트리가 있다. 이와 같은 트리를 DFS와 비슷한 방식으로 탐색하려 한다. 탐색을 시작할 때에는 트리의 한 정점에서 시작하여, 한 번도 지나지 않은 간선을 따라서 다음 정

www.acmicpc.net

한국어 번역 지문으로 알기 어려워 추가하면, 이 문제는 단순히 두 트리가 동형인지를 확인하는 문제가 아닌 출발점을 root로 하는 두 rooted tree가 동형인지를 확인하는 문제이다.

 

입력제한이 충분히 작으므로 Tree Isomorphism에 대한 AHU algorithm(Aho-Hopcroft-Ullman algorithm)에 사용되는, 루트가 고정된 트리에 대하여 탐색순서에 무관하게 얻을 수 있는 트리 고유의 문자열을 찾는 코드를 작성해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

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

int T;

void solve() {
	string s1, s2; cin >> s1 >> s2;
	vector<string> vec[3000];
	int lv = 0;
	for (auto& l : s1) {
		if (l == '0') lv++;
		else {
			string tmp = "0";
			sort(vec[lv].begin(), vec[lv].end());
			for (auto& s : vec[lv]) tmp += s;
			tmp += "1";
			vec[lv].clear();
			lv--;
			vec[lv].emplace_back(tmp);
		}
	}
	s1 = "";
	sort(vec[0].begin(), vec[0].end());
	for (auto&s:vec[0]) s1 += s;
	vec[0].clear();

	for (auto& l : s2) {
		if (l == '0') lv++;
		else {
			string tmp = "0";
			sort(vec[lv].begin(), vec[lv].end());
			for (auto& s : vec[lv]) tmp += s;
			tmp += "1";
			vec[lv].clear();
			lv--;
			vec[lv].emplace_back(tmp);
		}
	}
	s2 = "";
	sort(vec[0].begin(), vec[0].end());
	for (auto& s : vec[0]) s2 += s;
	vec[0].clear();

	if (s1 == s2) cout << 1 << '\n';
	else cout << 0 << '\n';
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) solve();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 26660 // C++] A + B  (0) 2023.07.20
[BOJ 2275 // C++] 트리의 높이 줄이기  (0) 2023.07.19
[BOJ 1344 // C++] 축구  (0) 2023.07.17
[BOJ 15707 // C++] exceed or not  (1) 2023.07.16
[BOJ 2705 // C++] 팰린드롬 파티션  (0) 2023.07.15

+ Recent posts