1. ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ด๋?
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์์ ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง ๊ฐ๋ ๋ฐ ํ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ฌ๊ธฐ์ ‘์ต๋จ’์ ์๋ฏธ๋ ๊ฒฝ๋ก ์์ ๊ฐ์ค์น ํฉ์ด ๊ฐ์ฅ ์๋ค๋ ๋ป์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ง๋์์ ๋ ๋์๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ ์ ๊ฐ ํ๊ณ ์๋ ์ด ๋ฌธ์ : https://www.acmicpc.net/problem/16928 ์์์ '์ ์ '์ ๊ฒ์ํ์ ์นธ์ด ๋ ๊ฒ์ด๋ฉฐ, ๊ฐ ์นธ๋ง๋ค ์ด๋ํ๋ ๊ฒ์ด ๊ฒฝ๋ก๋ฅผ ํตํด ์ด๋ํ๋ ์ํฉ์ด ๋๋ ๊ฒ์ ๋๋ค. ๋ค๋ง, ์ด ๋ฌธ์ ์์๋ ๊ฐ ๊ฒฝ๋ก์ ๊ฐ์ค์น๊ฐ ๋ชจ๋ 1๋ก ๋์ผํ ์ํฉ์ด๋ฉฐ, ์ด ๊ฒฝ์ฐ์๋ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํธ๋ ๊ฒ ์ ํฉํ์ง ๊ธ์ ๋ง์ง๋ง ๋ถ๋ถ์ ์ธ๊ธํ๋๋ก ํ๊ฒ ์ต๋๋ค.
2. ๋ํ์ ์ธ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ง์ด ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ ์ธ ๊ฐ์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ: ๊ฐ์ค์น๊ฐ ์์์ธ ๊ทธ๋ํ์์ ์ถ๋ฐ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ต๋จ ๊ฒฝ๋ก๊ฐ ํ์ ๋ ๋ ธ๋๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ฉฐ, ๊ฐ ๋ ธ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ ๋๋ค.
- ํ๋ก์ด๋-์์ฌ ์๊ณ ๋ฆฌ์ฆ: ๋ชจ๋ ์ ์ ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์์๋ ์์๋ ์๊ด์์ผ๋ฉฐ, ์์ ์ฌ์ดํด์ด ์๋ ๊ทธ๋ํ์์ ์ ํจํ๊ฒ ์๋ํฉ๋๋ค.
- ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ: ์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ค์ต์คํธ๋ผ์ ๋ฌ๋ฆฌ ๋ชจ๋ ๊ฐ์ ์ ์ฌ๋ฌ ๋ฒ ๊ฒ์ฌํ์ฌ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์๋ฆฌ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๊ธฐ ์ํด ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ ์์ด๋์ด๋ ์๋์ ๊ฐ์ต๋๋ค.
- ์ถ๋ฐ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฐจ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ฉด์ ์ต์ข ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ต๋๋ค.
- ‘๋ฐฉ๋ฌธํ ๋
ธ๋’์ ‘๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋’๋ฅผ ๋๋๊ณ , ํ์ฌ ๋ฐฉ๋ฌธํ ๋
ธ๋์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋
ธ๋๋ฅผ ์ ํํ์ฌ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ์๋ฆฌ๋ก ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
์์
- ๊ฐ ์ ์ ์ซ์๋ ๋ ๋ ธ๋ ์ฌ์ด์ ๊ฐ์ค์น๋ฅผ ๋ํ๋ ๋๋ค.
- ์ฌ๊ธฐ์ A์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ ๋จ๊ณ:
- ์ด๊ธฐํ: ์ถ๋ฐ ๋ ธ๋ A์ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ , ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ ๋ฌดํ๋๋ก ์ค์ ํฉ๋๋ค.
- ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋ ์ ํ: ํ์ฌ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ์ถ๋ฐ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํฉ๋๋ค. ์ฒ์์๋ A๊ฐ ์ ํ๋๊ฒ ์ฃ .
- ๊ฑฐ๋ฆฌ ๊ฐฑ์ : ์ ํ๋ ๋
ธ๋ A์์ ์ง์ ์ฐ๊ฒฐ๋ ๋
ธ๋ B์ D์ ๊ฑฐ๋ฆฌ๋ฅผ ํ์ธํ๊ณ , A๋ฅผ ๊ฒฝ์ ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง๋ค๋ฉด ๊ฑฐ๋ฆฌ ๊ฐ์ ๊ฐฑ์ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, A์์ B๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ 5์ด๋ฏ๋ก, B๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ 5๋ก ๊ฐฑ์ ํฉ๋๋ค.
- A์์ D๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ 3์ด๋ฏ๋ก, D๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ 3์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
- ๋ฐ๋ณต: ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ๊ณ์ ์ ํํ๊ณ , ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
- ๊ฒฐ๊ณผ: ๋ชจ๋ ๋ ธ๋์ ๋ํด ์ถ๋ฐ์ A์์๋ถํฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ตฌํด์ง๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋ ๊ตฌํ (Java ์์)
import java.util.*;
public class Dijkstra {
static class Edge {
int destination, weight;
Edge(int destination, int weight) {
this.destination = destination;
this.weight = weight;
}
}
public static void dijkstra(List<List<Edge>> graph, int source) {
int[] distances = new int[graph.size()];
Arrays.fill(distances, Integer.MAX_VALUE);
distances[source] = 0;
PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingInt(e -> e.weight));
pq.add(new Edge(source, 0));
while (!pq.isEmpty()) {
Edge current = pq.poll();
for (Edge edge : graph.get(current.destination)) {
int newDist = distances[current.destination] + edge.weight;
if (newDist < distances[edge.destination]) {
distances[edge.destination] = newDist;
pq.add(new Edge(edge.destination, newDist));
}
}
}
System.out.println("์ถ๋ฐ์ ์์ ๊ฐ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ:");
for (int i = 0; i < distances.length; i++) {
System.out.println("๋
ธ๋ " + i + "๊น์ง์ ๊ฑฐ๋ฆฌ: " + distances[i]);
}
}
public static void main(String[] args) {
int n = 6; // ๋
ธ๋์ ์
List<List<Edge>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
// ์์ ๊ทธ๋ํ ๊ตฌ์ถ
graph.get(0).add(new Edge(1, 5)); // A->B (๊ฐ์ค์น 5)
graph.get(0).add(new Edge(3, 3)); // A->D (๊ฐ์ค์น 3)
graph.get(1).add(new Edge(2, 2)); // B->C (๊ฐ์ค์น 2)
graph.get(1).add(new Edge(4, 1)); // B->E (๊ฐ์ค์น 1)
graph.get(2).add(new Edge(5, 4)); // C->F (๊ฐ์ค์น 4)
graph.get(3).add(new Edge(4, 6)); // D->E (๊ฐ์ค์น 6)
graph.get(4).add(new Edge(5, 7)); // E->F (๊ฐ์ค์น 7)
dijkstra(graph, 0); // A์์ ์์
}
}
์์ ์ฝ๋์์, dijkstra ํจ์๋ ๊ทธ๋ํ๋ฅผ ๋ฐ์ ์ถ๋ฐ์ ์์ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ฐ์ ์์ ํ(Priority Queue)๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฐธ๊ณ : ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ์ด์
์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฐ์ ์์ ํ์์ ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ์์(์ฌ๊ธฐ์๋ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ์ ๋ ธ๋)๋ฅผ ๋น ๋ฅด๊ฒ ๊บผ๋ผ ์ ์์ต๋๋ค(์๊ฐ ๋ณต์ก๋ O(logN)). ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ํ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด ๋งค๋ฒ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ ธ๋๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ๋ชจ๋ ๋ ธ๋๋ฅผ ์ผ์ผ์ด ํ์ธํด์ผ ํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ ๋์์ง๋๋ค(O(N)).
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ ๊ทธ๋ํ์ ํํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๊ฐ ๋ณต์ก๋๋ O(ElogโกN)์ ๋๋ค. ์ฌ๊ธฐ์ ๋ ๊ฐ์ ์ ์, N์ ๋ ธ๋์ ์์ ๋๋ค.
๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ BFS์ ๋๋ค.
BFS๋ ์์์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐจ๋ก๋ก ํ์ํ๋ฉฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์์ต๋๋ค. ๋ ธ๋๋ฅผ ํ์ํ ๋๋ง๋ค ๊ฑฐ๋ฆฌ๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฏ๋ก, ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ ์์ ์ ์ ์์ ๋์ฐฉ ์ ์ ๊น์ง ๊ฑฐ์น๋ ๊ฐ์ ์ ๊ฐ์๊ฐ ์ต์์ธ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๊ฒ ์ฃ !
BFS๋ ์์์ ์์ ํน์ ๋ชฉํ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐ ์ ํฉํ์ง๋ง, ํน์ ํ ๋ชจ๋ ์ต๋จ ๊ฒฝ๋ก(๋ชจ๋ ๊ฒฝ๋ก ์ค ์ต๋จ)๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ํด์ผ ํฉ๋๋ค.
BFS๋ฅผ ์ฌ์ฉํ ์ต๋จ ๊ฒฝ๋ก ์์ (Java)
import java.util.*;
public class BFSExample {
public static int bfsShortestPath(Map<Integer, List<Integer>> graph, int start, int end) {
Queue<Integer> queue = new LinkedList<>();
Map<Integer, Integer> distance = new HashMap<>();
queue.add(start);
distance.put(start, 0);
while (!queue.isEmpty()) {
int node = queue.poll();
if (node == end) return distance.get(node); // ์ต๋จ ๊ฑฐ๋ฆฌ ๋์ฐฉ
for (int neighbor : graph.get(node)) {
if (!distance.containsKey(neighbor)) {
queue.add(neighbor);
distance.put(neighbor, distance.get(node) + 1);
}
}
}
return -1; // ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ
}
}
์ฐธ๊ณ ๋ธ๋ก๊ทธ:
'๐ป Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Arrays.sort(๋ฐฐ์ด, ๋น๊ต ๊ธฐ์ค) (2) | 2024.10.03 |
---|---|
์ด์งํ์ ์๊ณ ๋ฆฌ์ฆ (0) | 2022.10.10 |