๋ฐฑ์ค 1765 ๋ญ์ธ์ ํ ์ ํ๊ธฐ[JAVA]
- -
๐๋งํฌ
1765 ๋ญ์ธ์ ํ ์ ํ๊ธฐ Gold2
โ ๏ธ๋ฌธ์
๋ญ์ธ์์ ์๋์ ์ ํต์ด๋ค. ์ด๋ฒ ์บ ํ์์๋ ์ด๊น์์ด ๋ญ์ธ์ ๋ํ๊ฐ ์ด๋ ธ๋ค. ๊ทธ๋ฐ๋ฐ, ๋ญ์ธ์์ ํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๋๊ฐ ์ฐ๋ฆฌ ํธ์ด๊ณ , ๋๊ฐ ์ฐ๋ฆฌ ํธ์ด ์๋์ง๋ฅผ ์์์ผ ํ ๊ฒ์ด๋ค. ๋ญ์ธ์์ ํ์ ์ ํ๋ ์์น์, ํ์ ํ์๋ค์ ์ธ๊ฐ๊ด๊ณ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
- ๋ด ์น๊ตฌ์ ์น๊ตฌ๋ ๋ด ์น๊ตฌ์ด๋ค.
- ๋ด ์์์ ์์๋ ๋ด ์น๊ตฌ์ด๋ค.
์ด ๋ ๋ ํ์์ด ์น๊ตฌ์ด๋ฉด ๊ฐ์ ํ์ ์ํด์์ด์ผ ํ๋ฉฐ, ๊ฐ์ ํ์ ์ํด ์๋ ์ฌ๋๋ค๋ผ๋ฆฌ๋ ์ ๋ถ ์น๊ตฌ์ฌ์ผ ํ๋ค.
ํ์๋ค์ ์ธ๊ฐ๊ด๊ณ๊ฐ ์ฃผ์ด์ง๋ฉด, ๋ญ์ธ์์ ์ํ ํ ์ ํ๊ธฐ๋ฅผ ํ ๋, ์ต๋ ์ผ๋ง๋ ๋ง์ ํ์ด ๋ง๋ค์ด์ง ์ ์๋์ง ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ์์ ์ n์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ์๋ค์ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค. (2 ≤ n ≤ 1000)
๋์งธ ์ค์ ํ์ ๊ฐ์ ์ธ๊ฐ๊ด๊ณ ์ค ์๋ ค์ง ๊ฒ์ ๊ฐ์ m์ด ์ฃผ์ด์ง๋ค. (1 ≤ m ≤ 5000)
๋ค์ m๊ฐ์ ์ค์๋ ํ ์ค์ ํ ๊ฐ์ฉ, ํ์ ๊ฐ์ ์ธ๊ฐ๊ด๊ณ๊ฐ F p q ํน์ E p q์ ํํ๋ก ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. (1 ≤ p < q ≤ n)
์ฒซ ๋ฒ์งธ ๊ธ์๊ฐ F์ธ ๊ฒฝ์ฐ์๋ p์ q๊ฐ ์น๊ตฌ์ธ ๊ฒ์ด๊ณ , E์ธ ๊ฒฝ์ฐ๋ p์ q๊ฐ ์์์ธ ๊ฒฝ์ฐ์ด๋ค.
์ ๋ ฅ์ ๋ชจ์์ด ์์์ด ๋ณด์ฅ๋๋ค. ์ฆ, ๋ ํ์์ด ๋์์ ์น๊ตฌ์ด๋ฉด์ ์์์ธ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์, ๊ฐ๋ฅํ ์ต๋ ํ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐๋ถ์
์ต๋ ํ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์น๊ตฌ๋ผ๋ฆฌ๋ง ์ฎ์ด์ฃผ๋ฉด ์ฌ์ค ๋์ด๊ธฐ ๋๋ฌธ์ ์น๊ตฌ์ธ ๊ฒฝ์ฐ๋ค์ ํ๋๋ก ์ฎ์ด์ฃผ๊ณ , ๋ผ์ด๋ฒ ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ผ์ด๋ฒ์ ๋ผ์ด๋ฒ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์น๊ตฌ๋ก ๋ฃ๊ณ ์น๊ตฌ๋ก ๋ฌถ์ฌ์๋ ํ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ต์ด๋ค. ๊ฐ์ ํ์ ๋ถ๋ณํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ ๋์จ ํ์ธ๋๋ฅผ ๋ ์ฌ๋ ธ๋ค. ๋ชจ๋ ํ์๋ค์ ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋กํ๊ณ ์น๊ตฌ๋ผ๋ฆฌ ํ๋์ ๋ถ๋ชจ(ํ์ฅ)์ ๊ณต์ ํ๋๋ก ๊ตฌํํ๋ฉด ๋ง์ง๋ง์ ์ ์ฒด ํ์ ๋๋ฉฐ ๋ถ๋ชจ(ํ์ฅ์ ์)์ ์๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํ๋ฉด ๋ ๊ฒ์ด๋ค.
1. ๋ณ์ ์ ์ธ์ ์๋ ์ฝ๋์ ๊ฐ์ด ํ์๋ค. ๋ถ๋ชจ๋ ธ๋๋ฅผ ๊ธฐ๋กํ๋ parent๋ฐฐ์ด, ๋ผ์ด๋ฒ์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํํด์ a๋ผ์ด๋ฒ์ด b๋ผ๋ฉด rivalGraph[a][b] = true; ์ ๊ฐ์ ํ์์ผ๋ก ๊ธฐ๋กํ ๊ฒ์ด๋ค. team์ ๋ง์ง๋ง ํ์ฅ ์๋ฅผ ๊ณ์ฐํ ๋ ์ฐ์ผ ๋ฐฐ์ด์ด๋ฉฐ, ์น๊ตฌ ๋ฐฐ์ด์ ๋ฐ๋ก ๋์ง ์์ ๊ฒ์ ์น๊ตฌ๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ ๋์์ ํ์ ๋งบ์ด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์์๋ค.
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[] parent;
static int N, M, result = 0;
static int[] team;
static boolean[][] rivalGraph;
2. ์ ๋์จ ํ์ธ๋ ๋ก์ง๊ณผ ๊ฐ์ด ์ด๊ธฐ์๋ ์๊ธฐ ์์ ์ ํ์ฅ์ผ๋ก ์ค์ ํ๋ค. ์ดํ ๊ด๊ณ๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ ์น๊ตฌ๋ผ๋ฉด ๋ฐ๋ก ์ฎ์ด์ฃผ๊ณ , ๋ผ์ด๋ฒ์ด๋ผ๋ฉด ๋ผ์ด๋ฒ ๋ฐฐ์ด์ ๊ธฐ๋กํ๋ค.
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
String relationship = st.nextToken();
int student1 = Integer.parseInt(st.nextToken());
int student2 = Integer.parseInt(st.nextToken());
if (relationship.equals("E")) {
rivalGraph[student1][student2] = true;
rivalGraph[student2][student1] = true;
}else{
makeFriend(student1, student2);
}
}
3.๋ผ์ด๋ฒ์ ๋ผ์ด๋ฒ์ ์น๊ตฌ๋ก ๋ง๋๋ ์ฝ๋์ด๋ค. ๋ณด์ด๋ฏ ๋ชจ๋ ์ฌ๋์ ํ์ํ๋ฉด์ ํด๋น ์ฌ๋์ ๋ผ์ด๋ฒ์ ๋ผ์ด๋ฒ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์น๊ตฌ๋ฅผ ๋ง๋ ๋ค.
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(rivalGraph[i][j]){
for(int k = 1; k <= N; k++){
if(rivalGraph[j][k]) {
makeFriend(i, k);
}
}
}
}
}
4. ํ ๊ฐ์๋ฅผ ์ธ๋ ๋ก์ง์ด๋ค. ๋ชจ๋ ํ์์ ๋๋ฉด์ ํ์ฅ์ด ๋๊ตฌ์ธ์ง ์ฒดํฌํ๊ณ , ํ์ฅ์ ์๋ง ์นด์ดํธ ๋๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ์ ์ฒด์์ 0์ด ์๋ ์ซ์๋ง ๊ฒฐ๊ณผ๊ฐ์ ์นด์ดํธํ๋ค.
for(int i = 1; i <= N; i++) {
team[findParent(i)]++;
}
for (int i : team) {
if(i != 0){
result ++;
}
}
5.์๋ ์ฝ๋๋ ์น๊ตฌ๋ฅผ ๋งบ๋ ์ฝ๋์ ๋ถ๋ชจ์ฐพ๋ ์ฝ๋์ด๋ค. ์น๊ตฌ๋ ํ์ด ๊ฐ์ผ๋ ํ์ฅ๋ฅผ ๊ณต์ ํ๋๋ก ๊ตฌํํ์ผ๋ฉฐ,(ํ์ฅ ๋ฒํธ๊ฐ ๋์ ๊ฒฝ์ฐ๊ฐ ํ์ ํก์ํจ.), ํด๋น ํ์์ ํ์ฅ์ ์ฐพ๋ ์ฝ๋๋ ์ฌ๊ท์ ์ผ๋ก ํ์ ์๊ธฐ ์์ ์ด ํ์ฅ์ผ ๊ฒฝ์ฐ ๋ฉ์ถ๋๋ก ๊ตฌํํ๋ค.
static void makeFriend(int student1, int student2) {
if (findParent(student1) != findParent(student2)) {
if (student1 > student2) {
parent[findParent(student2)] = findParent(student1);
}else{
parent[findParent(student1)] = findParent(student2);
}
}
}
static int findParent(int i) {
if (parent[i] == i) {
return i;
}
return parent[i] = findParent(parent[i]);
}
โ์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[] parent;
static int N, M, result = 0;
static int[] team;
static boolean[][] rivalGraph;
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
team = new int[N + 1];
parent = new int[N + 1];
rivalGraph = new boolean[N + 1][N + 1];
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
String relationship = st.nextToken();
int student1 = Integer.parseInt(st.nextToken());
int student2 = Integer.parseInt(st.nextToken());
if (relationship.equals("E")) {
rivalGraph[student1][student2] = true;
rivalGraph[student2][student1] = true;
}else{
makeFriend(student1, student2);
}
}
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(rivalGraph[i][j]){
for(int k = 1; k <= N; k++){
if(rivalGraph[j][k]) {
makeFriend(i, k);
}
}
}
}
}
for(int i = 1; i <= N; i++) {
team[findParent(i)]++;
}
for (int i : team) {
if(i != 0){
result ++;
}
}
System.out.println(result);
}
static void makeFriend(int student1, int student2) {
if (findParent(student1) != findParent(student2)) {
if (student1 > student2) {
parent[findParent(student2)] = findParent(student1);
}else{
parent[findParent(student1)] = findParent(student2);
}
}
}
static int findParent(int i) {
if (parent[i] == i) {
return i;
}
return parent[i] = findParent(parent[i]);
}
}
๐๊ฒฐ๊ณผ
์ ๋์จ ํ์ธ๋๋ฅผ ๊ตฌํํ๋๋ฐ ์ ๋ฅผ ๋จน์๋ค. ๋ค ์์ฑํด๋๊ณ ์ฝ๋๊ฐ ์ ๋๋ก ์คํ์ด ์๋์ 30๋ถ ๋ด๋ด ํ์ธํด๋ณด๋ ์ ๋์จ ํ์ธ๋ ์ฝ๋๋ด์ findParent๋ฅผ ๋นผ๋จน์์๋ค. ๋ง์ ๋ฌธ์ ๋ฅผ ํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ํด์ ธ์ผ ์ค์๋ฅผ ์ค์ผ ์ ์์ ๊ฒ ๊ฐ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2668 ์ซ์๊ณ ๋ฅด๊ธฐ[JAVA] (0) | 2023.09.26 |
---|---|
๋ฐฑ์ค 1106 ํธํ [JAVA] (0) | 2023.08.02 |
๋ฐฑ์ค 1068 ํธ๋ฆฌ[JAVA] (0) | 2023.07.30 |
๋ฐฑ์ค 18430 ๋ฌด๊ธฐ๊ณตํ[JAVA] (0) | 2023.07.29 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค