๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ Dijkstra algorithm

์ด ๊ธ€์˜ ๋ชฉ์ฐจ7๊ฐœ
  1. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” DFS / BFS์™€ ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ?
  2. โœ… ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๋…ธ๋“œ ๊ฐ„์˜ ์ด๋™ ๋น„์šฉ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๐Ÿ“Œ ๋ฌธ์ œ ์˜ˆ์‹œ :
  4. โ€œ๋…ธ๋“œ 1์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์ด๋™ ๋น„์šฉ์ด n ์ดํ•˜์ธ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผโ€
  5. BFS์™€์˜ ์ฐจ์ด์ 
  6. ์ฝ”๋“œ ๊ตฌํ˜„ (Java)
  7. ๐ŸŽฏ ํ•ต์‹ฌ

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

์ถœ๋ฐœ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ต์ŠคํŠธ๋ผ๋Š” DFS / BFS์™€ ๋ฌด์—‡์ด ๋‹ค๋ฅผ๊นŒ?

โœ… ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ๋…ธ๋“œ ๊ฐ„์˜ ์ด๋™ ๋น„์šฉ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

BFS : ๋…ธ๋“œ ๊ฐ„์˜ ์ด๋™ ๋น„์šฉ์ด ๋ชจ๋‘ 1์ธ ๊ฒฝ์šฐ, ์ด๋™ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ

๋‹ค์ต์ŠคํŠธ๋ผ : ๋…ธ๋“œ ๊ฐ„์˜ ์ด๋™ ๋น„์šฉ์ด ๋‹ฌ๋ผ ์ด๋™ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ์ตœ์†Œ ๋น„์šฉ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

๐Ÿ“Œ ๋ฌธ์ œ ์˜ˆ์‹œ :

โ€œ๋…ธ๋“œ 1์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์ด๋™ ๋น„์šฉ์ด n ์ดํ•˜์ธ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผโ€

์‚ฌ์šฉ ๋ณ€์ˆ˜

List<int[]>[] list : โ†’ ๊ฐ ์ธ๋ฑ์Šค๋Š” ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, int[] ๋ฐฐ์—ด์˜ 0๋ฒˆ ์ธ๋ฑ์Šค๋Š” ๋„์ฐฉ ๋…ธ๋“œ, 1๋ฒˆ ์ธ๋ฑ์Šค๋Š” ์ด๋™ ๋น„์šฉ์„ ์ €์žฅ

Queue queue : โ†’ BFS์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š” ํ

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) (์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋”์šฑ ์ตœ์ ํ™” ๊ฐ€๋Šฅ)

์ „์ฒด ๊ธ€ ๋ณด๊ธฐ