์ฝ์ง๋ง ๋ณต์กํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
๐ค ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ธ๊น?
โ๏ธ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค.
ํน์ ์ง์ ์์ ๋ชฉํ ์ง์ ์ผ๋ก ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ฉฐ ๊ฐ์ผํ ๋ ์ฌ์ฉํ ์ ์๋ค.
์) 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 ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.