백준 4195 친구 네트워크

Kim Jio·2023년 1월 9일
0

민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다.

어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.

친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있으며, 알파벳 대문자 또는 소문자로만 이루어진 길이 20 이하의 문자열이다.

출력

친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.

친구 관계가 생성될 때마다 네트워크 상 친구의 수를 출력하는 문제
친구 관계는 100000개가 주어지기 때문에 최대 200000명

  1. 이름에게 번호 부여할 map과 번호를 이름으로 변환할 map 생성
  2. 자기 자신이 부모인 집합 생성 + 집합의 크기를 저장할 배열 생성 (200000)
  3. 관계가 맺어질 때마다 집합을 더해주고 집합의 크기 또한 갱신
    갱신해준 집합 이외의 집합 크기는 1로
  4. find() 할 때 집합의 depth를 평탄화하는 구문을 추가해준다
    return friendMap[res] = find()
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

import java.util.StringTokenizer;

public class Main {
    static int list[];
    static HashMap<String, Integer> hs;
    static HashMap<Integer, String> revHs;
    static int friendMap[], nodeCount[];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int T = Integer.parseInt(br.readLine());
        for(int i = 0; i < T; i++) {
            // 100,000명 관계의 수
            int F = Integer.parseInt(br.readLine());
            StringBuilder sb = new StringBuilder("");
            hs = new HashMap<>();
            revHs = new HashMap<>();
            friendMap = new int[200001];
            nodeCount = new int[200001];
            for(int j = 0; j < 100000; j++) {
                friendMap[j] = j;
                nodeCount[j] = 1;
            }
            int idx = 0;
            for(int j = 0; j < F; j++) {
                st = new StringTokenizer(br.readLine());
                String s1 = st.nextToken();
                String s2 = st.nextToken();
               if(!hs.containsKey(s1)) {
                   hs.put(s1, idx);
                   revHs.put(idx, s1);
                   idx++;
               }
               if(!hs.containsKey(s2)) {
                   hs.put(s2, idx);
                   revHs.put(idx, s2);
                   idx++;
               }
               int r = howManyFr(s1, s2);
               sb.append(r + "\n");
            }
            System.out.print(sb);
        }
    }
    private static int howManyFr(String s1, String s2) {
        int r1 = find(s1);
        int r2 = find(s2);
        // 같은 집합이 아니라면
        if(r1 != r2) {
            friendMap[r2] = r1;
            nodeCount[r1] += nodeCount[r2];
            nodeCount[r2] = 1;
        }
        return nodeCount[r1];
    }






    private static int find(String s) {
        int res = hs.get(s);
        if(res == friendMap[res]) {
            return res;
        } else {
            return friendMap[res] = find(revHs.get(friendMap[res]));
        }

    }

}
profile
what's important is an unbreakable heart

0개의 댓글