๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Algorithm

[Java] Dijkstra Path ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„(ft. ์šฐ์„ ์ˆœ์œ„ ํ)

728x90
๋ฐ˜์‘ํ˜•

์‰ฝ์ง€๋งŒ ๋ณต์žกํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿค” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์™œ ์“ธ๊นŒ?

โ—๏ธ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

ํŠน์ • ์ง€์ ์—์„œ ๋ชฉํ‘œ ์ง€์ ์œผ๋กœ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋ฉฐ ๊ฐ€์•ผํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ) A์—์„œ D๋กœ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๋น„์šฉ์€ ์ตœ์†Œ ๊ฐ’์€?

A -> D = 5

A -> B -> D = 5

A -> C -> D = 3

 

๋”ฐ๋ผ์„œ ์‹ค์ œ ์ตœ์†Œ ๋น„์šฉ ์ง€๋ถˆํ•˜๋Š” ๊ฒฝ๋กœ๋Š” A -> C -> D ์ด๋‹ค.

๐Ÿฅธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋กœ์ง

1. ์‹œ์ž‘์ง€์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค๊ณผ์˜ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค.

Result List

์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A B C D E
๋น„์šฉ 0 3 1 5 ๋ฌดํ•œ

์ถœ๋ฐœ ์ง€์ ์ด A์ผ ๋•Œ, ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ ๊ฐ€๋Š” ๋น„์šฉ์€ ์—†์œผ๋‹ˆ 0

A์—์„œ E์™€ ๊ฐ™์ด ๋ฐ”๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ๋กœ๋Š” ์—†์„ ๋•Œ, ๋น„์šฉ์„ ๋ฌดํ•œ(์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์•„์ฃผ ํฐ ๊ฐ’)์œผ๋กœ ํ•œ๋‹ค.2

 

2. ๊ฐ€์žฅ ์ž‘์€ ๋น„์šฉ์„ ์šฐ์„ ์ˆœ์œ„์— ๋‹ด๋Š”๋‹ค.

Priority Queue

์šฐ์„  ์ˆœ์œ„ ํ C B D  
๋น„์šฉ 1 3 5  

์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๋น„์šฉ์ด ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒƒ์„ ์šฐ์„  ์ˆœ์œ„๋กœํ•˜์—ฌ ์ถ”์ถœ๋˜๋Š” ํ์ด๋‹ค.

์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ํ•˜๋‚˜์”ฉ ์ถ”์ถœํ•˜๋ฉฐ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์˜ ๋น„์šฉ์„ ํ™•์ธํ•˜๊ณ  ๊ฐฑ์‹ ํ•œ๋‹ค.

C์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A B C D E
๋น„์šฉ - - - 2 -

C์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” Dํ•˜๋‚˜ ๋ฟ์ด๊ณ  D๊นŒ์ง€์˜ ๋น„์šฉ์€ 2์ด๋‹ค.

์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ๊บผ๋‚ธ C๋Š” ์ด๋ฏธ 1์ด๋ผ๋Š” ๋น„์šฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— D๋กœ ๊ฐ€๊ธฐ์œ„ํ•ด์„œ๋Š” 1 + 2๋ผ๋Š” ๋น„์šฉ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ A์—์„œ D๊นŒ์ง€๊ฐ€๋Š”๋ฐ 3์ด๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ณ  ํ˜„์žฌ Result List์˜ ๋น„์šฉ(5)๋ณด๋‹ค ์ž‘๊ธฐ์— ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

3์˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” D๊นŒ์ง€๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ์šฐ์„  ์ˆœ์œ„ ํ์— ๋„ฃ์–ด์ค€๋‹ค.

 

Priority Queue

์šฐ์„  ์ˆœ์œ„ ํ D B D  
๋น„์šฉ 3 3 5  

D์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” E์ด๊ณ  ๋น„์šฉ์€ 2์ด๊ธฐ ๋•Œ๋ฌธ์— 3 + 2 = 5๊ฐ€ A -> E ๊ฒฝ๋กœ์˜ ๋น„์šฉ์ด๋‹ค.

ํ˜„์žฌ A -> E๊นŒ์ง€์˜ ๋น„์šฉ์ธ ๋ฌดํ•œ๋Œ€ ๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๊ฐฑ์‹ ํ•˜๊ณ  E๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์šฐ์„  ์ˆœ์œ„ ํ์— ๋„ฃ์–ด์ค€๋‹ค.

 

Result List

์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A B C D E
๋น„์šฉ 0 3 1 3 5

Priority Queue

์šฐ์„  ์ˆœ์œ„ ํ B D E  
๋น„์šฉ 3 5 5  

์ด์ œ ์šฐ์„  ์ˆœ์œ„ ํ์—์„œ B๋ฅผ ์„ ํƒํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ D์™€์˜ ๋น„์šฉ์„ ํ•ฉ์น˜๋ฉด A -> D = 5์ด๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์žฌ Result List์— D๊นŒ์ง€์˜ ๋น„์šฉ์€ 3์œผ๋กœ ๋” ์ž‘์œผ๋ฏ€๋กœ ๊ฐฑ์‹ ๋˜์ง€ ์•Š๊ณ  ๋์ด๋‚œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์Œ ์ˆœ์„œ์ธ D๋ฅผ ์šฐ์„  ์ˆœ์œ„ ํ์—์„œ ๋ฝ‘์•„๋„ ์ด๋ฏธ D์˜ ๊ฐ’์ด 5๋กœ Result List์˜ D๊ฐ’ ๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒฝ๋กœ๋„ ๋” ํด ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ์— ์•„๋ฌด ํ–‰์œ„๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๋๋‚ธ๋‹ค. ์ด๋ ‡๊ฒŒ E๊นŒ์ง€๋„ ๋”ฐ๋กœ ๊ฐฑ์‹ ์„ ํ•˜์ง€ ์•Š๊ณ  ๋๋‚œ๋‹ค.

 

=> ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ตœ์ข… ๋น„์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์ด๋œ๋‹ค.(A์—์„œ ์ถœ๋ฐœ)

Result List

์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ A B C D E
๋น„์šฉ 0 3 1 3 5

๐Ÿ˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

O(E * longE): E๋Š” Node์˜ ๊ฐ„์„ ์˜ ์ˆ˜

 

์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ฒŒ๋˜๋ฉด, ์ธ์ ‘ํ•œ ๊ฐ„์„ ์„ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ๊ฐ„์„ ์˜ ์ด ํ•ฉ(E)๋งŒํผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋•Œ, ์šฐ์„  ์ˆœ์œ„ ํ์— ๊ฐ„์„ ๋งŒํผ ํ• ๋‹น๋˜๋ฏ€๋กœ O(logE) ๋งŒํผ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๋ชจ๋“  ๊ฐ„์„ ์„ ๊ฒ€์‚ฌ(E) * ๊ฐ„์„ ๋งŒํผ ์šฐ์„  ์ˆœ์œ„ ํ ๋ฐœ์ƒ(logE) => E * logE

 

๐Ÿง ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ์ˆœ์œ„ ํ(Priority Queue) ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

public class DijstraPath {

    public static class Node implements Comparable<Node> {  // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
        String vertex;  // ์—ฐ๊ฒฐ ๋…ธ๋“œ์˜ ์ด๋ฆ„
        int weight; // ๊ฐ€์ค‘์น˜

        // ๋…ธ๋“œ ์ƒ์„ฑ์ž
        public Node(String vertex, int weight){
            this.vertex = vertex;
            this.weight = weight;
        }
        @Override
        public int compareTo(Node o) {
            return this.weight - o.weight;  // ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ฅธ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ(์šฐ์„ ์ˆœ์œ„ ํ์˜ ๊ธฐ์ค€๋„ ๋จ)
        }
    }

    public Map<String, Integer> dijkstraFunc(Map<String, ArrayList<Node>> map, String start) {
        PriorityQueue<Node> pq = new PriorityQueue<>(); // min heap ๊ตฌ์กฐ์˜ ์šฐ์„ ์ˆœ์œ„ ํ ์ƒ์„ฑ
        Map<String, Integer> result = new HashMap<>();    // ์‹œ์ž‘ ์ง€์ ์ด ์ตœ์ข…์ ์œผ๋กœ ๋ชจ๋“  ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ตœ์ข… ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
        Node pqNode;    // ์šฐ์„ ์ˆœ์œ„ ํ์— ๋“ค์–ด๊ฐˆ ๋…ธ๋“œ
        ArrayList<Node> nodeList;   // ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์„ ํƒ๋œ ๋…ธ๋“œ๋“ค๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด

        // ์ดˆ๊ธฐํ™”(์‹œ์ž‘์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์˜ ๊ฐ€์ค‘์น˜ ์ ์šฉ)
        for(String key : map.keySet()){
            result.put(key, Integer.MAX_VALUE);   // ๋ชจ๋‘ ์ตœ๋Œ€์น˜๋กœ ์ดˆ๊ธฐํ™”
        }
        result.put(start, 0); // ์ž๊ธฐ ์ž์‹ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
        pq.add(new Node(start, 0)); // ์ž๊ธฐ ์ž์‹ ์„ ์ฒซ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋Œ€์ž…

        while(!pq.isEmpty()){   // ํ๊ฐ€ ๋น„์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•จ

            pqNode = pq.poll(); // ์šฐ์„  ์ˆœ์œ„์˜ ์ธ์ž ์ถ”์ถœ(์—ฌ๊ธฐ์„  min ๊ฐ’)

            if(result.get(pqNode.vertex) < pqNode.weight){  // ์ƒˆ๋กœ ์„ ํƒ๋œ node๋ณด๋‹ค ์ด๋ฏธ ๋” ์ ์€ ๊ฐ€์ค‘์น˜๋ผ๋ฉด ํŒจ์Šค
                continue;
            }

            nodeList = map.get(pqNode.vertex); // ์ƒˆ๋กœ ์„ ํƒํ•œ node์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ํ˜„์žฌ๋ณด๋‹ค ๋” ์ ๋‹ค๋ฉด ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค๊ณผ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋น„๊ต
            for(Node searchNode : nodeList) {
                int newWeight = searchNode.weight + pqNode.weight;
                if(newWeight < result.get(searchNode.vertex)){  // ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋” ์ ๋‹ค๋ฉด ๊ฐฑ์‹ 
                    result.put(searchNode.vertex, newWeight);
                    pq.add(new Node(searchNode.vertex, newWeight)); // ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถ”๊ฐ€
                }
            }
        }
        return result;
    }

Node ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋…ธ๋“œ์˜ ์ด๋ฆ„๊ณผ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

ํ”„๋กœํผํ‹ฐ๊ฐ€ 2๊ฐœ(์ด๋ฆ„๊ณผ ๊ฐ€์ค‘์น˜ ๊ฐ’)์„ ๊ฐ€์ง€๋ฏ€๋กœ ์šฐ์„  ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ํ•ด์•ผํ•œ๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด์„œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•