[백준 4195] 친구 네트워크(Java)

최민길(Gale)·2023년 11월 14일
1

알고리즘

목록 보기
144/172

문제 링크 : https://www.acmicpc.net/problem/4195

이 문제는 유니온 파인드를 이용하여 풀 수 있습니다. 이 문제의 가장 어려운 부분은 문자열을 유니온 파인드로 그룹화하기입니다. 이를 위해 맵을 이용하여 각 문자열을 키로, 유니온 파인드를 수행할 배열의 인덱스를 벨류로 할당하는 방식으로 진행합니다.

여기서 유니온 과정을 진행할 때 다른 그룹의 크기만큼 그룹의 크기가 증가하기 때문에 현재 노드의 크기 정보도 함께 저장해야 합니다. 따라서 병합 시 병합되는 노드의 크기만큼 병합하는 노드에 더해주고 그 크기를 리턴합니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    static int[] parent,level;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        while(T-- >0){
            int F = Integer.parseInt(br.readLine());
            parent = new int[F*2];
            level = new int[F*2];
            for(int i=0;i<F*2;i++){
                parent[i] = i;
                level[i] = 1;
            }

            int idx = 0;
            Map<String,Integer> map = new HashMap<>();
            for(int i=0;i<F;i++){
                StringTokenizer st = new StringTokenizer(br.readLine());
                String first = st.nextToken();
                String second = st.nextToken();

                if(!map.containsKey(first)) map.put(first,idx++);
                if(!map.containsKey(second)) map.put(second,idx++);

                sb.append(union(map.get(first), map.get(second))).append("\n");
            }
        }
        System.out.println(sb);
    }

    static int union(int a, int b){
        a = find(a);
        b = find(b);
        if(a != b){
            parent[b] = a;
            level[a] += level[b];
        }
        return level[a];
    }

    static int find(int a){
        if(a == parent[a]) return a;
        else return parent[a] = find(parent[a]);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글