๋ฐ˜์‘ํ˜•

๐Ÿš€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Dijkstra Algorithm)

1. ๊ฐœ๋…

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


2. ์ž‘๋™ ๋ฐฉ์‹ ์š”์•ฝ

  1. ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ๊ฑฐ๋ฆฌ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”, ๋‚˜๋จธ์ง€๋Š” ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •
  2. ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ ์„ ํƒ
  3. ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ ์—…๋ฐ์ดํŠธ
  4. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

3. C# ์˜ˆ์ œ ์ฝ”๋“œ (์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ)

using System;
using System.Collections.Generic;

class Edge
{
    public int To, Cost;
    public Edge(int to, int cost)
    {
        To = to;
        Cost = cost;
    }
}

class Node : IComparable<Node>
{
    public int Vertex, Distance;
    public Node(int v, int d)
    {
        Vertex = v;
        Distance = d;
    }

    public int CompareTo(Node other)
    {
        return Distance.CompareTo(other.Distance);
    }
}

void Dijkstra(int start, List<Edge>[] graph, int[] dist)
{
    int n = graph.Length;
    bool[] visited = new bool[n];
    for (int i = 0; i < n; i++) dist[i] = int.MaxValue;
    dist[start] = 0;

    var pq = new PriorityQueue<Node, int>();
    pq.Enqueue(new Node(start, 0), 0);

    while (pq.Count > 0)
    {
        pq.TryDequeue(out var current, out _);
        int now = current.Vertex;

        if (visited[now]) continue;
        visited[now] = true;

        foreach (var edge in graph[now])
        {
            int cost = dist[now] + edge.Cost;
            if (cost < dist[edge.To])
            {
                dist[edge.To] = cost;
                pq.Enqueue(new Node(edge.To, cost), cost);
            }
        }
    }
}

๐Ÿ“Œ C# 10 ์ด์ƒ์—์„œ PriorityQueue<TElement, TPriority> ์‚ฌ์šฉ ๊ฐ€๋Šฅ (System.Collections.Generic)


4. ์‹œ๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„

ํ•ญ๋ชฉ ๋ณต์žก๋„
์‹œ๊ฐ„ ๋ณต์žก๋„ O(E log V) (์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ ์‹œ)
๊ณต๊ฐ„ ๋ณต์žก๋„ O(V + E)
 
  • V: ์ •์  ์ˆ˜
  • E: ๊ฐ„์„  ์ˆ˜

5. ํŠน์ง•

  • ์Œ์ˆ˜ ๊ฐ„์„ ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋‹จ์ผ ์‹œ์ž‘์  ๊ธฐ์ค€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
  • BFS๋ณด๋‹ค ๋ณต์žกํ•˜์ง€๋งŒ ๋” ์ •ํ™•ํ•˜๊ณ  ๋น ๋ฆ„ (๊ฐ€์ค‘์น˜ ํฌํ•จ ๊ฐ€๋Šฅ)
  • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ์— ์ž์ฃผ ๋“ฑ์žฅ

6. ์˜ˆ์‹œ

์ •์ : 0, 1, 2, 3  
๊ฐ„์„ : (0→1, 4), (0→2, 2), (2→1, 1), (1→3, 1), (2→3, 5)

์ถœ๋ฐœ: 0 → ๋„์ฐฉ: ๋ชจ๋“  ๋…ธ๋“œ  
์ตœ๋‹จ ๊ฑฐ๋ฆฌ: [0, 3, 2, 4]

7. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ์‹ค์ „์—์„œ๋Š” BFS vs ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์„ ํƒ์ด ์ค‘์š”ํ•จ (๊ฐ€์ค‘์น˜ ์œ ๋ฌด)
๋ฐ˜์‘ํ˜•