๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_30_๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_30_๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 12. 00:30
728x90
๋ฐ˜์‘ํ˜•

220212 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=F-tkqjUiik0&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=30 

 

 

 

 

 

 

 

1. ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ

: ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํ•œ ์ง€์ ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

- ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

- ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

: ๊ฐ ์ง€์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ ๋…ธ๋“œ๋กœ ํ‘œํ˜„

: ์ง€์ ๊ฐ„ ์—ฐ๊ฒฐ๋œ ์„ ์€ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„

์ตœ๋‹จ๊ฒฝ๋กœ๋ฌธ์ œ ( ๋…ธ๋“œ์™€ ๊ฐ„์„  )

 

 

 

 

 

 

2. ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ

: ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ณ„์‚ฐ

: ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ ( ํ˜„์‹ค์„ธ๊ณ„ ๋„๋กœ๋Š” ์Œ์˜ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜์ง€ x )

: ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ ( ๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด, ์ž„์˜์˜ ๊ณผ์ • ๋ฐ˜๋ณต )

: ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋” ์งง์€ ๊ฒฝ๋กœ ์ฐพ์œผ๋ฉด! ์ด ๊ฒฝ๋กœ๊ฐ€ ์ œ์ผ ์งง์€ ๊ฒฝ๋กœ๋‹ค!!

: ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด ๊ฐ€์ง€๊ณ  ์žˆ์Œ

 

1) ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •

2) ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”

3) ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒ

4) ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 

5) 3, 4 ๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต

 

=> ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ๋œ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ๊ณ ์ •๋˜์–ด ๋”์ด์ƒ ๋ฐ”๋€Œ์ง€ x

=> ํ•œ ๋‹จ๊ณ„๋‹น ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ์ •ํ•˜๋Š” ๊ฒƒ

=> ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค 1์ฐจ์› ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธ (์ˆœ์ฐจํƒ์ƒ‰) ํ•œ๋‹ค

 

 

 

 

  • python ( colab ์•ˆ๋˜๋‹ˆ vscode ๋กœ ใ„ฑ )
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
visited = [False] * (n + 1)
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    graph[a].append((b, c))

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
def get_smallest_node():
    min_value = INF
    index = 0 # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    for i in range(1, n + 1):
        if distance[i] < min_value and not visited[i]:
            min_value = distance[i]
            index = i
    return index

def dijkstra(start):
    # ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    distance[start] = 0
    visited[start] = True
    for j in graph[start]:
        distance[j[0]] = j[1]
    # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n - 1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    for i in range(n - 1):
        # ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        now = get_smallest_node()
        visited[now] = True
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
        for j in graph[now]:
            cost = distance[now] + j[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[j[0]]:
                distance[j[0]] = cost

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n + 1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])
  • c++
#include <bits/stdc++.h>
#define INF 1e9 // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

using namespace std;

// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
int n, m, start;
// ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
vector<pair<int, int> > graph[100001];
// ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
bool visited[100001];
// ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
int d[100001];

// ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
int getSmallestNode() {
    int min_value = INF;
    int index = 0; // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    for (int i = 1; i <= n; i++) {
        if (d[i] < min_value && !visited[i]) {
            min_value = d[i];
            index = i;
        }
    }
    return index;
}

void dijkstra(int start) {
    // ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    d[start] = 0;
    visited[start] = true;
    for (int j = 0; j < graph[start].size(); j++) {
        d[graph[start][j].first] = graph[start][j].second;
    }
    // ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n - 1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    for (int i = 0; i < n - 1; i++) {
        // ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        int now = getSmallestNode();
        visited[now] = true;
        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
        for (int j = 0; j < graph[now].size(); j++) {
            int cost = d[now] + graph[now][j].second;
            // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if (cost < d[graph[now][j].first]) {
                d[graph[now][j].first] = cost;
            }
        }
    }
}

int main(void) {
    cin >> n >> m >> start;

    // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
        graph[a].push_back({b, c});
    }

    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
    fill_n(d, 100001, INF);
    
    // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
    dijkstra(start);

    // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    for (int i = 1; i <= n; i++) {
        // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
        if (d[i] == INF) {
            cout << "INFINITY" << '\n';
        }
        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else {
            cout << d[i] << '\n';
        }
    }
}
  • java
import java.util.*;

class Node {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }
}

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int n, m, start;
    // ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
    public static boolean[] visited = new boolean[100001];
    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    public static int[] d = new int[100001];

    // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
    public static int getSmallestNode() {
        int min_value = INF;
        int index = 0; // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
        for (int i = 1; i <= n; i++) {
            if (d[i] < min_value && !visited[i]) {
                min_value = d[i];
                index = i;
            }
        }
        return index;
    }

    public static void dijkstra(int start) {
        // ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
        d[start] = 0;
        visited[start] = true;
        for (int j = 0; j < graph.get(start).size(); j++) {
            d[graph.get(start).get(j).getIndex()] = graph.get(start).get(j).getDistance();
        }
        // ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n - 1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
        for (int i = 0; i < n - 1; i++) {
            // ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
            int now = getSmallestNode();
            visited[now] = true;
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
            for (int j = 0; j < graph.get(now).size(); j++) {
                int cost = d[now] + graph.get(now).get(j).getDistance();
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
                if (cost < d[graph.get(now).get(j).getIndex()]) {
                    d[graph.get(now).get(j).getIndex()] = cost;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }

        // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
            graph.get(a).add(new Node(b, c));
        }

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        Arrays.fill(d, INF);
        
        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        dijkstra(start);

        // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        for (int i = 1; i <= n; i++) {
            // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
            if (d[i] == INF) {
                System.out.println("INFINITY");
            }
            // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
            else {
                System.out.println(d[i]);
            }
        }
    }
}

=> ์ด O(V) ๋ฒˆ์— ๊ฑธ์ณ์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๋งค๋ฒˆ ์„ ํ˜• ํƒ์ƒ‰ํ•จ

=> ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(v^2)

 

 

 

 

 

 

 

3. ์šฐ์„ ์ˆœ์œ„ ํ (Priority Queue)

: ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œ

: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€, ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ํ™•์ธ

 

 

 

 

4. ํž™ (Heap)

: ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

: ์ตœ์†Œ ํž™๊ณผ ์ตœ๋Œ€ ํž™ ์žˆ์Œ

=> ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ํž™(Heap) ์‚ฌ์šฉ

 

  • python ( ์ตœ์†Œ ํž™ )
import heapq

# ์˜ค๋ฆ„์ฐจ์ˆœ ํž™ ์ •๋ ฌ
def heapsort(iterable) :
    h = []
    result = []
    # ๋ชจ๋“  ์›์†Œ ์ฐจ๋ก€๋Œ€๋กœ ํž™ ์‚ฝ์ž…
    for value in iterable :
        heapq.heappush(h, value)
    # ํž™์— ์‚ฝ์ž…๋œ ๋ชจ๋“  ์›์†Œ ์ฐจ๋ก€๋Œ€๋กœ ๊บผ๋‚ด ๋‹ด๊ธฐ
    for i in range(len(h)) :
        result.append(heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 6, 8, 9, 2, 4, 7, 0])
print(result)

  • python ( ์ตœ๋Œ€ ํž™ )
import heapq

# ๋‚ด๋ฆผ์ฐจ์ˆœ ํž™ ์ •๋ ฌ
def heapsort(iterable) :
    h = []
    result = []
    # ๋ชจ๋“  ์›์„œ ์ฐจ๋ก€๋Œ€๋กœ ํž™ ์‚ฝ์ž…
    for value in iterable :
        heapq.heappush(h, -value)
    # ํž™์— ์‚ฝ์ž…๋œ ๋ชจ๋“  ์›์†Œ ์ฐจ๋ก€๋Œ€๋กœ ๊บผ๋‚ด ๋‹ด๊ธฐ
    for i in range(len(h)) :
        result.append(-heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 6, 8, 9, 2, 4, 7, 0])
print(result)

 

 

 

 

 

 

+) ๋‹ค์ต์ŠคํŠธ๋ผ + ์šฐ์„ ์ˆœ์œ„ ํ + ํž™

  • python
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    graph[a].append((b, c))

def dijkstra(start):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, start))
    distance[start] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n + 1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

  • c++
#include <bits/stdc++.h>
#define INF 1e9 // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

using namespace std;

// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
int n, m, start;
// ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
vector<pair<int, int> > graph[100001];
// ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
int d[100001];

void dijkstra(int start) {
    priority_queue<pair<int, int> > pq;
    // ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
    pq.push({0, start});
    d[start] = 0;
    while (!pq.empty()) { // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        int dist = -pq.top().first; // ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋น„์šฉ 
        int now = pq.top().second; // ํ˜„์žฌ ๋…ธ๋“œ
        pq.pop();
        // ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if (d[now] < dist) continue;
        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for (int i = 0; i < graph[now].size(); i++) {
            int cost = dist + graph[now][i].second;
            // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if (cost < d[graph[now][i].first]) {
                d[graph[now][i].first] = cost;
                pq.push(make_pair(-cost, graph[now][i].first));
            }
        }
    }
}

int main(void) {
    cin >> n >> m >> start;

    // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
        graph[a].push_back({b, c});
    }

    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
    fill(d, d + 100001, INF);
    
    // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
    dijkstra(start);

    // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    for (int i = 1; i <= n; i++) {
        // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
        if (d[i] == INF) {
            cout << "INFINITY" << '\n';
        }
        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else {
            cout << d[i] << '\n';
        }
    }
}
  • java
import java.util.*;

class Node implements Comparable<Node> {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }

    // ๊ฑฐ๋ฆฌ(๋น„์šฉ)๊ฐ€ ์งง์€ ๊ฒƒ์ด ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •
    @Override
    public int compareTo(Node other) {
        if (this.distance < other.distance) {
            return -1;
        }
        return 1;
    }
}

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int n, m, start;
    // ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    public static int[] d = new int[100001];

    public static void dijkstra(int start) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        // ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
        pq.offer(new Node(start, 0));
        d[start] = 0;
        while(!pq.isEmpty()) { // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
            // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
            Node node = pq.poll();
            int dist = node.getDistance(); // ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋น„์šฉ 
            int now = node.getIndex(); // ํ˜„์žฌ ๋…ธ๋“œ
            // ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
            if (d[now] < dist) continue;
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
            for (int i = 0; i < graph.get(now).size(); i++) {
                int cost = d[now] + graph.get(now).get(i).getDistance();
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
                if (cost < d[graph.get(now).get(i).getIndex()]) {
                    d[graph.get(now).get(i).getIndex()] = cost;
                    pq.offer(new Node(graph.get(now).get(i).getIndex(), cost));
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }
        
        // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
            graph.get(a).add(new Node(b, c));
        }

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        Arrays.fill(d, INF);
        
        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        dijkstra(start);

        // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        for (int i = 1; i <= n; i++) {
            // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
            if (d[i] == INF) {
                System.out.println("INFINITY");
            }
            // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
            else {
                System.out.println(d[i]);
            }
        }
    }
}

 

=> ํž™ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์šฉํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(ElogV)

=> ์ „์ฒด ๊ณผ์ •์€ E๊ฐœ ์›์†Œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ชจ๋‘ ๋นผ๋‚ด๋Š” ์—ฐ์‚ฐ ๋ชจ๋‘ ์œ ์‚ฌ

=> ์ตœ๋Œ€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(E) ๋งŒํผ ์—ฐ์‚ฐ ์ˆ˜ํ–‰

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments