๐Ÿ“ฌ algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ก ] ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ํฌ๋ฃจ์Šค์นผ, ํ”„๋ฆผ(์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ)

jcowwk 2024. 4. 9. 21:44

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ํฌ๋ฃจ์Šค์นผ, ํ”„๋ฆผ(์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ)


๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ
ํฌ๋ฃจ์Šค์นผ๊ณผ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ ์ž…๋‹ˆ๋‹ค !
 
1. ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ
2. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
3. ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜


1. ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ

๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์ด ์—†์ด ๋ชจ๋“  ์ ๋“ค์„ ์—ฐ๊ฒฐ์‹œํ‚จ ํŠธ๋ฆฌ๋“ค ์ค‘ ์„ ๋ถ„์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ
ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋ฆฌ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
 

2. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์„ ๋ถ„์ด ์‚ฌ์ดํด์„ ๋งŒ๋“ค์ง€ ์•Š์„ ๋•Œ๋งŒ ์š•์‹ฌ๋‚ด์–ด ๊ทธ ์„ ๋ถ„์„ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
n๊ฐœ์˜ ํŠธ๋ฆฌ๋“ค์ด ์ ์ฐจ ํ•ฉ์ณ์ ธ์„œ 1๊ฐœ์˜ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.
 

 
์œ„์˜ ๊ทธ๋ž˜ํ”„์— ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด๋ณด๊ฒ ๋‹ค.
 
๋จผ์ €, ์„ ๋ถ„์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ๋‹ค.
๋‹ค์Œ์œผ๋กœ ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ์„ ๋ถ„์„ ๊ณ ๋ฅธ ํ›„, ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
 

import java.util.*;

class Edge {
    char start;
    char end;
    int weight;

    public Edge(char start, char end, int weight) {
        this.start = start;
        this.end = end;
        this.weight = weight;
    }
}

class Main {
    public static int find(int[] parent, int x) {
        if (parent[x] == x) {
            return x;
        }
        return parent[x] = find(parent, parent[x]);
    }

    public static void union(int[] parent, int x, int y) {
        int rootX = find(parent, x);
        int rootY = find(parent, y);
        if (rootX != rootY) {
            parent[rootY] = rootX;
        }
    }

    public static boolean isCycle(int[] parent, Edge edge) {
        int startParent = find(parent, edge.start - 'a');
        int endParent = find(parent, edge.end - 'a');
        if (startParent == endParent) {
            return true;
        }
        union(parent, startParent, endParent);
        return false;
    }

    public static void main(String[] args) {
        int[] parent = new int[6];
        for (int i = 0; i < 6; i++) {
            parent[i] = i;
        }

        List<Edge> edges = new ArrayList<>();
        edges.add(new Edge('b', 'c', 1));
        edges.add(new Edge('c', 'f', 1));
        edges.add(new Edge('b', 'f', 2));
        edges.add(new Edge('a', 'd', 2));
        edges.add(new Edge('d', 'e', 3));
        edges.add(new Edge('a', 'e', 4));
        edges.add(new Edge('b', 'd', 4));
        edges.add(new Edge('d', 'f', 7));
        edges.add(new Edge('a', 'b', 8));
        edges.add(new Edge('e', 'f', 9));

        List<Edge> selectedEdges = new ArrayList<>();
        for (Edge edge : edges) {
            if (!isCycle(parent, edge)) {
                selectedEdges.add(edge);
            }
        }

        for (Edge edge : selectedEdges) {
            System.out.println("Selected edge: " + edge.start + " -> " + edge.end + ", weight: " + edge.weight);
        }
    }
}

 
์ตœ์ข… ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—…์‹œ๊ฐ„์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ c๋กœ ์ž‘์„ฑํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์—๋Š” java๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.
 
์ง€๊ธˆ์˜ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ์‚ฝ์ž…ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ,
๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ๊ฐ€์ค‘์น˜ ์ •๋ ฌ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

 

3. ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ทธ๋ฆฌ๋””+๋™์  ๊ณ„ํš)์€ ์ž„์˜์˜ ์  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ ํ›„, (n-1)๊ฐœ์˜ ์„ ๋ถ„์„ ํ•˜๋‚˜ ์”ฉ ์ถ”๊ฐ€์‹œ์ผœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
1๊ฐœ์˜ ํŠธ๋ฆฌ๊ฐ€ ์ž๋ผ๋‚˜์„œ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค.
 

 
์œ„์˜ ๊ทธ๋ž˜ํ”„์— ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด๋ณด๊ฒ ๋‹ค.
 
๋จผ์ €, ์ž„์˜์˜ ์  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค.
๋ฐฐ์—ด์— ์†ํ•˜์ง€ ์•Š์€ ์ ์— ๋Œ€ํ•˜์—ฌ, ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ์†Œ์ธ ์ ์„ ์„ ํƒํ•œ๋‹ค.
์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.


์ •๋ง ํ—ท๊ฐˆ๋ ธ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๊ฐ€์ง€๋ฅผ ๊ณต๋ถ€ํ–ˆ๋‹ค.
๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋‚˜์š” !