์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
Algorithm

๋ฐฑ์ค€ 1765 ๋‹ญ์‹ธ์›€ ํŒ€ ์ •ํ•˜๊ธฐ[JAVA]

  • -
๋ฐ˜์‘ํ˜•

๋‹ญ์‹ธ์›€์€ ์›”๋“œ์˜ ์ „ํ†ต์ด๋‹ค. ์ด๋ฒˆ ์บ ํ”„์—์„œ๋„ ์–ด๊น€์—†์ด ๋‹ญ์‹ธ์›€ ๋Œ€ํšŒ๊ฐ€ ์—ด๋ ธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋‹ญ์‹ธ์›€์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ˆ„๊ฐ€ ์šฐ๋ฆฌ ํŽธ์ด๊ณ , ๋ˆ„๊ฐ€ ์šฐ๋ฆฌ ํŽธ์ด ์•„๋‹Œ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋‹ญ์‹ธ์›€์˜ ํŒ€์„ ์ •ํ•˜๋Š” ์›์น™์€, ํ‰์†Œ ํ•™์ƒ๋“ค์˜ ์ธ๊ฐ„๊ด€๊ณ„์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๋‚ด ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋Š” ๋‚ด ์นœ๊ตฌ์ด๋‹ค.
  2. ๋‚ด ์›์ˆ˜์˜ ์›์ˆ˜๋„ ๋‚ด ์นœ๊ตฌ์ด๋‹ค.

์ด ๋•Œ ๋‘ ํ•™์ƒ์ด ์นœ๊ตฌ์ด๋ฉด ๊ฐ™์€ ํŒ€์— ์†ํ•ด์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ™์€ ํŒ€์— ์†ํ•ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค๋ผ๋ฆฌ๋Š” ์ „๋ถ€ ์นœ๊ตฌ์—ฌ์•ผ ํ•œ๋‹ค.

ํ•™์ƒ๋“ค์˜ ์ธ๊ฐ„๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ๋‹ญ์‹ธ์›€์„ ์œ„ํ•œ ํŒ€ ์ •ํ•˜๊ธฐ๋ฅผ ํ•  ๋•Œ, ์ตœ๋Œ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํŒ€์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ•™์ƒ์˜ ์ˆ˜ 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๋ฅผ ๋นผ๋จน์—ˆ์—ˆ๋‹ค. ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ต์ˆ™ํ•ด์ ธ์•ผ ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.