๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ Dijkstra algorithm
์ด ๊ธ์ ๋ชฉ์ฐจ7๊ฐ
- ๋ค์ต์คํธ๋ผ๋ DFS / BFS์ ๋ฌด์์ด ๋ค๋ฅผ๊น?
- โ ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด ๋ค์ต์คํธ๋ผ๋ ๋ ธ๋ ๊ฐ์ ์ด๋ ๋น์ฉ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
- ๐ ๋ฌธ์ ์์ :
- โ๋ ธ๋ 1์์ ์ถ๋ฐํ์ฌ ์ด๋ ๋น์ฉ์ด n ์ดํ์ธ ๋ ธ๋์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผโ
- BFS์์ ์ฐจ์ด์
- ์ฝ๋ ๊ตฌํ (Java)
- ๐ฏ ํต์ฌ
๐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (Dijkstra Algorithm)
์ถ๋ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
๋ค์ต์คํธ๋ผ๋ DFS / BFS์ ๋ฌด์์ด ๋ค๋ฅผ๊น?

โ ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด ๋ค์ต์คํธ๋ผ๋ ๋ ธ๋ ๊ฐ์ ์ด๋ ๋น์ฉ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋ค.
BFS : ๋ ธ๋ ๊ฐ์ ์ด๋ ๋น์ฉ์ด ๋ชจ๋ 1์ธ ๊ฒฝ์ฐ, ์ด๋ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ตฌํด์ผํ๋ ๊ฒฝ์ฐ
๋ค์ต์คํธ๋ผ : ๋ ธ๋ ๊ฐ์ ์ด๋ ๋น์ฉ์ด ๋ฌ๋ผ ์ด๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ์ต์ ๋น์ฉ์ด ์ค์ํ ๊ฒฝ์ฐ
๐ ๋ฌธ์ ์์ :

โ๋ ธ๋ 1์์ ์ถ๋ฐํ์ฌ ์ด๋ ๋น์ฉ์ด n ์ดํ์ธ ๋ ธ๋์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผโ
์ฌ์ฉ ๋ณ์
List<int[]>[] list : โ ๊ฐ ์ธ๋ฑ์ค๋ ์ถ๋ฐ ๋ ธ๋๋ฅผ ์๋ฏธํ๋ฉฐ, int[] ๋ฐฐ์ด์ 0๋ฒ ์ธ๋ฑ์ค๋ ๋์ฐฉ ๋ ธ๋, 1๋ฒ ์ธ๋ฑ์ค๋ ์ด๋ ๋น์ฉ์ ์ ์ฅ
Queue
int[] distance : โ ๊ฐ ๋ ธ๋๊น์ง์ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด โ ์ถ๋ฐ ๋ ธ๋(1๋ฒ ์ธ๋ฑ์ค)๋ 0์ผ๋ก ์ด๊ธฐํ, ๋๋จธ์ง๋ Integer.MAX_VALUE๋ก ์ค์ (๋ฌดํ๋)
BFS์์ ์ฐจ์ด์
visited ๋ฐฐ์ด์ด ํ์ ์์ โ ์ด์ : ๊ฐ ๋ ธ๋๋ฅผ ํ์ธํ ๋, ํ์ฌ ํ์ ๊ฒฝ๋ก๊ฐ ์ต์๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํ์ ์ถ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ
์ฝ๋ ๊ตฌํ (Java)
import java.util.*;
class Solution {
public int solution(int N, int[][] road, int K) {
// 1. ๊ทธ๋ํ ์ด๊ธฐํ (์ธ์ ๋ฆฌ์คํธ)
List<int[]>[] list = new List[N + 1];
for (int i = 0; i <= N; i++) {
list[i] = new ArrayList<>();
}
// 2. ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ
int[] distance = new int[N + 1];
Arrays.fill(distance, Integer.MAX_VALUE);
// 3. ๋๋ก ์ ๋ณด ์
๋ ฅ (์๋ฐฉํฅ)
for (int[] r : road) {
list[r[0]].add(new int[]{r[1], r[2]});
list[r[1]].add(new int[]{r[0], r[2]});
}
// 4. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
distance[1] = 0;
while (!queue.isEmpty()) {
int now = queue.poll();
for (int[] next : list[now]) {
int nextNode = next[0];
int cost = next[1];
// ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒ์ด ๋ ์งง๋ค๋ฉด ๊ฐฑ์ ํ ํ์ ์ถ๊ฐ
if (distance[now] + cost < distance[nextNode]) {
distance[nextNode] = distance[now] + cost;
queue.add(nextNode);
}
}
}
// 5. K ์ดํ์ ๊ฑฐ๋ฆฌ์ธ ๋
ธ๋ ๊ฐ์ ๋ฐํ
int answer = 0;
for (int d : distance) {
if (d <= K) answer++;
}
return answer;
}
}
๐ฏ ํต์ฌ
โ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ โ BFS์ ๋ค๋ฅด๊ฒ ๊ฐ ๊ฒฝ๋ก์ ์ด๋ ๋น์ฉ์ ๊ณ ๋ คํด์ผ ํ ๋ ์ ํฉ โ visited ๋ฐฐ์ด์ด ํ์ ์์ โ ์ต์ ๋น์ฉ ๊ฒฝ๋ก๋ง ๊ฐฑ์ โ ์๊ฐ ๋ณต์ก๋ : O(E log V) (์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋์ฑ ์ต์ ํ ๊ฐ๋ฅ)