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

 

이번에 볼 문제는 백준 4195번 문제인 친구 네트워크이다.
문제는 아래 링크를 확인하자.

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

 

4195번: 친구 네트워크

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진

www.acmicpc.net

이 문제는 입력이 주어지는 각 시점마다 연결된 친구의 수를 구해야한다는 점을 유의하면 map과 disjoint set을 이용하여 간단히 해결할 수 있다.

 

N가지 친구관계가 주어지면 최대 2N명의 이름이 등장할 수 있다는 점에 유의하자.

 

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

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

map<string, int> dict;
int arr[200000];
int cnt[200000];

int findf(int x) {
	if (x == arr[x]) return x;
	return arr[x] = findf(arr[x]);
}

void solve() {
	dict.clear();
	int N; cin >> N;

	for (int i = 0; i < 2 * N; i++) {
		arr[i] = i;
	}
	
	for (int i = 0; i < 2 * N; i++) {
		cnt[i] = 1;
	}

	int idx = 0;
	while (N--) {
		string s1, s2; cin >> s1 >> s2;
		if (dict.find(s1) == dict.end()) dict.insert({ s1,idx++ });
		if (dict.find(s2) == dict.end()) dict.insert({ s2,idx++ });
		
		int x = findf(dict[s1]), y = findf(dict[s2]);
		if (x != y) {
			cnt[x] += cnt[y];
			arr[y] = x;
		}
		
		cout << cnt[x] << '\n';
	}
}

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

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

+ Recent posts