민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다.
어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진다. 친구 관계는 두 사용자의 아이디로 이루어져 있으며, 알파벳 대문자 또는 소문자로만 이루어진 길이 20 이하의 문자열이다.
출력
친구 관계가 생길 때마다, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오.
예제 입력 1
2
3
Fred Barney
Barney Betty
Betty Wilma
3
Fred Barney
Betty Wilma
Barney Betty
예제 출력 1
2
3
4
2
2
4
풀이 방법
- Set과 유니온 파인드 알고리즘을 사용해서 풀이하였다.
- 해당하는 Set이 없으면 왼쪽을 root로 설정하여 새로 만들었고, size Set도 똑같이 설정해주었다.
- 이 때 첫 입력은 무조건 2가 출력이 된다.

- 그런 다음 다음 입력이 들어오면 이 때부터 Union-Find를 수행하여 해당 Set에 원소가 존재한다면, 입력 중에 존재하지 않는 원소를 Set에 추가시켜주고, 이 때 사이즈도 증가시켜준다.
- 이 과정을 반복하고 끝날 때 마다 size 리턴해주면 끝!
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
static Map<String, String> network;
static Map<String, Integer> size;
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 t = 0; t < T; t++){
network = new HashMap<>();
size = new HashMap<>();
int F = Integer.parseInt(br.readLine());
for(int f = 0; f < F; f++){
st = new StringTokenizer(br.readLine());
String person1 = st.nextToken();
String person2 = st.nextToken();
System.out.println(union(person1, person2));
}
}
}
public static String find(String person){
//해당 키를 가지고 있지 않다면
if(!network.containsKey(person)){
network.put(person, person);
size.put(person, 1);
}
if(!person.equals(network.get(person))){
network.put(person, find(network.get(person)));
}
return network.get(person);
}
public static int union(String person1, String person2){
String root1 = find(person1);
String root2 = find(person2);
if(!root1.equals(root2)){
network.put(root2, root1);
size.put(root1, size.get(root1) + size.get(root2));
}
return size.get(find(person1));
}
}
결과

회고
- 유니온 파인드를 부트캠프 때 슬쩍 해봤는데, 오랜만에 하려니 기억이 나지 않았다.
'알고리즘' 카테고리의 다른 글
| [백준] 색종이 붙이기 - Java (1) | 2025.03.07 |
|---|---|
| [프로그래머스] 디스크 컨트롤러 - JavaScript (1) | 2025.03.06 |
| [프로그래머스] 부대복귀 - JavaScript (2) | 2025.03.04 |
| [백준] 선수과목 - Java (1) | 2025.02.28 |
| [프로그래머스] 광물 캐기 - JavaScript (3) | 2025.02.26 |