ABOUT ME

์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์šฉ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹น~ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋Š” https://velog.io/@ows3090 ์— ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Today
Yesterday
Total
  • [Algorithm] Kruskal Algorithm(ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜)
    Algorithm 2020. 9. 6. 03:20
    ๋ฐ˜์‘ํ˜•

    Kruskal Algorithm

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

    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (https://programmers.co.kr/learn/courses/30/lessons/42861?language=cpp) ์ด ๋ฌธ์ œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ฐœ๋…์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

    1. ์ตœ์†Œ ๋น„์šฉ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ฐ„์„ ๋“ค์„ ์ •๋ ฌ์‹œํ‚ต๋‹ˆ๋‹ค.
    2. ์ •๋ ฌ๋œ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ทธ๋ž˜ํ”„์— ํฌํ•จ์‹œํ‚ค๋Š”๋ฐ ํฌํ•จ์‹œํ‚ค๊ธฐ ์ „์—๋Š” ์‚ฌ์ดํด ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•œ ๊ฒฝ์šฐ๋Š” ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์‚ฌ์ดํด์„ ํ˜•์„ฑ ์—ฌ๋ถ€๋Š” union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ


    ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ตœ์†Œ ๋น„์šฉ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ฐ„์„ ๋“ค์„ ์ •๋ ฌ์‹œํ‚ต๋‹ˆ๋‹ค.


    ๊ทธ๋ฆฌ๊ณ  ์ •๋ ฌ๋œ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ทธ๋ž˜ํ”„์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•  ๋•Œ (0, 1) -> (1, 3) -> (0, 2) ์ˆœ์„œ๋Œ€๋กœ ํฌํ•จํ•˜๋ฉด ๋‹ต์ด ๋‚˜์˜ค๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๊ฐ€ union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋’ค ๊ฐ„์„ ๋“ค์€ ๋ฌด์‹œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ์ด ์˜ˆ์™€ ๋‹ค๋ฅด๊ฒŒ ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๋น„๊ต ๋…ธ๋“œ๋ผ๋ฆฌ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹ค์Œ ๊ฐ„์„ ๋ถ€ํ„ฐ ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ์ฝ”๋“œ

    #include <string>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    // ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐ
    // ์—ฃ์ง€ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค
    class Edge{
    public:
    int s,e,c;
    Edge(int s,int e,int c):s(s),e(e),c(c){};
    };
    // ์—ฃ์ง€ ์ตœ์†Œ ๋น„์šฉ์ˆœ์œผ๋กœ ์ •๋ ฌ
    bool cmp(Edge a, Edge b){
    return a.c < b.c;
    }
    // union-find์—์„œ ๋ถ€๋ชจ๋…ธ๋“œ ์ฐพ๊ธฐ
    int getParent(int parent[], int x){
    if(x == parent[x]){return x;}
    return parent[x] = getParent(parent,parent[x]);
    }
    // union-find ๋ถ€๋ชจ๋…ธ๋“œ ํ•ฉ์น˜๊ธฐ
    void unionParent(int parent[], int a, int b){
    a = getParent(parent, a);
    b = getParent(parent, b);
    if(a<b){
    parent[b] = a;
    }
    else{
    parent[a] = b;
    }
    }
    // union-find ๋ถ€๋ชจ๋…ธ๋“œ ๊ฐ™์€์ง€ ์ฐพ๊ธฐ
    int findParent(int parent[], int a, int b){
    a = getParent(parent, a);
    b = getParent(parent, b);
    if(a == b)return 1;
    else return 0;
    }
    int solution(int n, vector<vector<int>> costs) {
    int answer = 0;
    int check[100];
    for(int i=0;i<100;i++){
    check[i] = i;
    }
    // ๊ฐ ์ •์ ์„ vec์— ๋„ฃ๊ณ  ๋น„์šฉ์ด ์ ์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์ •๋ ฌํ•œ๋‹ค.
    vector<Edge> vec;
    for(int i=0;i<costs.size();i++){
    Edge e = Edge(costs[i][0],costs[i][1],costs[i][2]);
    vec.push_back(e);
    }
    sort(vec.begin(),vec.end(),cmp);
    // ๊ฐ ๋…ธ๋“œ๋“ค ๊ด€๊ณ„๊ฐ€ ์‚ฌ์ดํด์ด ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•œ๋‹ค.
    for(int i=0;i<vec.size();i++){
    if(!findParent(check, vec[i].s, vec[i].e)){
    unionParent(check, vec[i].s, vec[i].e);
    answer+=vec[i].c;
    }
    }
    return answer;
    }
    • ์ถ”๊ฐ€๋กœ ๊ถ๊ธˆํ•œ ์ ์ด๋‚˜ ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.
    ๋ฐ˜์‘ํ˜•
Designed by Tistory.