출처 : https://www.acmicpc.net/problem/1765
풀이 방법
유니온 파인드 문제이다
우선 F인 친구가 나오게 된다면, union을 한다.
반면 E가 나오게 된다면 enemy에 저장을 한 후, 모든 enemy를 돌며 enemy의 enemy를 union을 해주었다.
이후 집합의 수를 Set을 활용하여 세었다.
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
static int n, m;
static int[] parents;
static ArrayList<Integer>[] enemy;
static int find(int a) {
if (parents[a] == a) return a;
parents[a] = find(parents[a]);
return parents[a];
}
static void union(int a, int b) {
int parA = find(a);
int parB = find(b);
if (parA != parB) {
if (parA < parB) {
parents[parB] = parA;
}
else {
parents[parA] = parB;
}
}
return;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
parents = new int[n+1];
enemy = new ArrayList[n+1];
for (int i = 0;i <= n;i++) {
parents[i] = i;
enemy[i] = new ArrayList<>();
}
for (int i = 0;i < m;i++) {
st = new StringTokenizer(br.readLine());
if (st.nextToken().equals("F")) {
union(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
else {
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
enemy[a].add(b);
enemy[b].add(a);
}
}
for (int i = 1;i <= n;i++) {
for (int k = 0;k < enemy[i].size();k++) {
int enemyIdx = enemy[i].get(k);
for (int j = 0;j < enemy[enemyIdx].size();j++) {
union(i, enemy[enemyIdx].get(j));
}
}
}
Set<Integer> ans = new HashSet<>();
for (int i = 1;i <= n; i++) {
find(i);
ans.add(parents[i]);
}
System.out.println(ans.size());
return ;
}
}'Algorithm' 카테고리의 다른 글
| [백준] 외판원 순회 2098번 (java) 비트마스킹 + dp (1) | 2025.06.15 |
|---|---|
| [백준] 우주 탐사선 17182번 (java) 플로이드 워샬, 순열 (1) | 2025.06.15 |
| [프로그래머스] 홀짝트리 (java) 그래프 (1) | 2025.06.08 |
| [백준] 불켜기 11967번 (java) (0) | 2025.06.08 |
| [백준] 당근 훔쳐 먹기 18234번 (c++) (0) | 2025.03.03 |