본문 바로가기

Coding Test

백준 4195 친구 네트워크

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

 

4195번: 친구 네트워크

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

map<string, string> parent;
map<string, int> cnt;

string findParent(string k){
    return parent[k] == k ? k : parent[k]=findParent(parent[k]);
}


void uni(string a, string b){

    string fa = findParent(a);
    string fb = findParent(b);

    if (fa == fb) {
        return;
    } else {

        parent[fb] = fa;
        cnt[fa] += cnt[fb];
    }

}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);


    int t;
    cin >> t;

    for (int test = 0; test < t; test++) {

        int f;
        cin >> f;

        cnt.clear();
        parent.clear();



        //friend는 c++의 예약어: 변수 선언 시 주의
        for (int fre = 0; fre < f; fre++) {



            string a, b;

            cin >> a >> b;

            //네트워크에 해당 친구가 처음 참여했을 경우 추가
            if (cnt.count(a) == 0) {
                cnt.insert(make_pair(a, 1));
                parent.insert(make_pair(a, a));
            }
            if (cnt.count(b) == 0) {
                cnt.insert(make_pair(b, 1));
                parent.insert(make_pair(b, b));
            }

            uni(a, b);


            cout << cnt[findParent(a)] << "\n";


        }

    }

    return 0;
}

 

disjoint set 문제이지만 정수 대신 string으로 구하는 문제이다.

map으로 <친구 이름, 네트워크의 수>, <친구 이름, 부모 이름>을 선언하고, 

해당 친구가 처음 들어왔다면 두 맵에 추가를 한다. 이후 같은 친구 네트워크에 union 연산을 하고 해당 친구 네트워크의 수를 출력하면 정답을 출력할 수 있다.

 

 * friend는 c++의 예약어 중 하나이다. 변수 선언 시 주의하자

'Coding Test' 카테고리의 다른 글

백준 1106 호텔  (0) 2024.04.08
백준 4256 트리  (1) 2024.04.07
백준 21939 문제 추천 시스템 Version 1  (0) 2024.04.05
백준 2346 풍선 터뜨리기  (0) 2024.04.04
백준 16937 두 스티커  (2) 2024.04.03