민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다.
어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다.
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있으며, 알파벳 대문자 또는 소문자로만 이루어진 길이 20 이하의 문자열이다.
친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
친구 관계가 생성될 때마다 네트워크 상 친구의 수를 출력하는 문제
친구 관계는 100000개가 주어지기 때문에 최대 200000명
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]));
}
}
}