Algorithm & Data Structures/BOJ

b.1707 ์ด๋ถ„ ๊ทธ๋ž˜ํ”„

Geisha 2025. 3. 12. 15:35

 

https://www.acmicpc.net/problem/1707

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„ ๋ฌธ์ œ - ๋ฐฑ์ค€ 1707 ๐Ÿš€

 


๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 1707๋ฒˆ - ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

 

์ด๋ถ„ ๊ทธ๋ž˜ํ”„๋ž€?

โ€ข ๋ชจ๋“  ์ •์ ์„ ๋‘ ๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„

โ€ข ๊ฐ™์€ ๊ทธ๋ฃน ๋‚ด ์ •์ ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•„์•ผ ํ•จ

โ€ข ์ฆ‰, ์ธ์ ‘ํ•œ ์ •์ ์€ ํ•ญ์ƒ ๋‹ค๋ฅธ ๊ทธ๋ฃน์— ์†ํ•ด์•ผ ํ•จ

 


๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

2
3 2
1 3
2 3
4 4
1 2
2 3
3 4
4 1

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

YES
NO

โžก ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์ด๋ฉฐ, ๋‘ ๋ฒˆ์งธ ๊ทธ๋ž˜ํ”„๋Š” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹˜

 


๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๋˜๋Š” DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)๋ฅผ ํ™œ์šฉํ•œ ๊ทธ๋ž˜ํ”„ ์ƒ‰์น  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

โœ๏ธ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ

 

โœ” BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ ์„ ๋‘ ๊ฐ€์ง€ ์ƒ‰์œผ๋กœ ์น ํ•˜๋ฉด์„œ ํƒ์ƒ‰

โœ” ์ธ์ ‘ํ•œ ์ •์ ์ด ๊ฐ™์€ ์ƒ‰์ด ๋œ๋‹ค๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹˜

โœ” ๋ชจ๋“  ์ •์ ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด BFS ์‹คํ–‰

โœ” ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๋ฉด YES, ์•„๋‹ˆ๋ฉด NO ์ถœ๋ ฅ

 


๐Ÿ”น Java ์ฝ”๋“œ ํ•ด์„ค

import java.util.*;
import java.io.*;

public class Main {

    static class Node {
        int num;
        boolean color;

        public Node(int num, boolean color) {
            this.num = num;
            this.color = color;
        }
    }

    static int T; // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        T = stringToInteger(br.readLine());

        for (int t = 0; t < T; t++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = stringToInteger(st.nextToken());  // ์ •์  ๊ฐœ์ˆ˜
            int E = stringToInteger(st.nextToken());  // ๊ฐ„์„  ๊ฐœ์ˆ˜
            sb.append(logic(N, E, br));
        }
        System.out.println(sb);
    }

    // ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„ ๋กœ์ง
    static String logic(int N, int E, BufferedReader br) throws IOException {
        ArrayList<Integer>[] list = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) {
            list[i] = new ArrayList<>();
        }

        for (int i = 0; i < E; i++) {
            StringTokenizer stLogic = new StringTokenizer(br.readLine());
            int a = stringToInteger(stLogic.nextToken());
            int b = stringToInteger(stLogic.nextToken());

            list[a].add(b);
            list[b].add(a);
        }

        int[] colors = new int[N + 1]; // 0: ๋ฏธ๋ฐฉ๋ฌธ, 1: ๋นจ๊ฐ•, -1: ํŒŒ๋ž‘

        for (int i = 1; i <= N; i++) {
            if (colors[i] == 0) { // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ 
                if (!BFS(i, list, colors)) return "NO\n";
            }
        }

        return "YES\n";
    }

    // BFS๋ฅผ ํ™œ์šฉํ•œ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„
    static boolean BFS(int start, ArrayList<Integer>[] list, int[] colors) {
        Queue<Node> q = new ArrayDeque<>();
        q.add(new Node(start, true));
        colors[start] = 1; // ์‹œ์ž‘ ์ •์ ์€ 1 (๋นจ๊ฐ•)

        while (!q.isEmpty()) {
            Node cur = q.poll();
            int curColor = colors[cur.num];

            for (int next : list[cur.num]) {
                if (colors[next] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์ด๋ฉด
                    colors[next] = -curColor; // ํ˜„์žฌ ์ •์ ๊ณผ ๋ฐ˜๋Œ€ ์ƒ‰์ƒ์œผ๋กœ ์น ํ•จ
                    q.add(new Node(next, !cur.color));
                } else if (colors[next] == curColor) { // ์ธ์ ‘ ์ •์ ์ด ๊ฐ™์€ ์ƒ‰์ด๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ X
                    return false;
                }
            }
        }
        return true;
    }

    // ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    static int stringToInteger(String s) {
        return Integer.parseInt(s);
    }
}

 

 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

 

๐Ÿ“Œ 1. ๊ทธ๋ž˜ํ”„ ์ž…๋ ฅ ๋ฐ ์ดˆ๊ธฐํ™”

ArrayList<Integer>[] list = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
    list[i] = new ArrayList<>();
}

for (int i = 0; i < E; i++) {
    StringTokenizer stLogic = new StringTokenizer(br.readLine());
    int a = stringToInteger(stLogic.nextToken());
    int b = stringToInteger(stLogic.nextToken());

    list[a].add(b);
    list[b].add(a);
}

โ€ข ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(list[])๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅ

โ€ข ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ์–‘์ชฝ(list[a].add(b) & list[b].add(a))์„ ์ถ”๊ฐ€

 


๐Ÿ“Œ 2. ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด BFS ์‹คํ–‰

int[] colors = new int[N + 1]; // 0: ๋ฏธ๋ฐฉ๋ฌธ, 1: ๋นจ๊ฐ•, -1: ํŒŒ๋ž‘

for (int i = 1; i <= N; i++) {
    if (colors[i] == 0) { // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ 
        if (!BFS(i, list, colors)) return "NO\n";
    }
}

โ€ข ๋ชจ๋“  ์ •์ (1 ~ N)์„ ํ™•์ธํ•˜๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์—์„œ BFS ์‹คํ–‰

โ€ข BFS ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ false์ด๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ โ€œNOโ€ ์ถœ๋ ฅ

 

๐Ÿ“Œ 3. BFS๋ฅผ ์‚ฌ์šฉํ•œ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„

Queue<Node> q = new ArrayDeque<>();
q.add(new Node(start, true));
colors[start] = 1; // ์‹œ์ž‘ ์ •์ ์„ 1 (๋นจ๊ฐ•)์œผ๋กœ ์„ค์ •

while (!q.isEmpty()) {
    Node cur = q.poll();
    int curColor = colors[cur.num];

    for (int next : list[cur.num]) {
        if (colors[next] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ์ด๋ฉด
            colors[next] = -curColor; // ๋ฐ˜๋Œ€ ์ƒ‰์ƒ์œผ๋กœ ์น ํ•จ
            q.add(new Node(next, !cur.color));
        } else if (colors[next] == curColor) { // ์ธ์ ‘ ์ •์ ์ด ๊ฐ™์€ ์ƒ‰์ด๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ X
            return false;
        }
    }
}

โ€ข ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BFS ํƒ์ƒ‰

โ€ข ๊ฐ ์ •์ ์„ ๋‘ ๊ฐœ์˜ ์ƒ‰(1, -1)์œผ๋กœ ์น ํ•˜๋ฉด์„œ ์ง„ํ–‰

โ€ข ์ด๋ฏธ ์น ํ•ด์ง„ ์ธ์ ‘ ์ •์ ์ด ๊ฐ™์€ ์ƒ‰์ด๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹˜

 


๐Ÿ† ์ •๋ฆฌ

 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

 

โœ” BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ํŒ๋ณ„

โœ” ์ •์  ๋ฐฉ๋ฌธ ์‹œ ๋‘ ๊ฐœ์˜ ์ƒ‰์œผ๋กœ ์น ํ•˜๋ฉฐ ํƒ์ƒ‰

โœ” O(N + E)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 

 

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ข‹์•„์š”์™€ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!