안녕하세요, GameLabMaster입니다! 이번 코딩 테스트 대비 포스팅에서는 그래프 알고리즘 중 플로이드-와샬(Floyd-Warshall) 알고리즘을 활용한 문제 풀이에 대해 알아보겠습니다. 플로이드-와샬 알고리즘은 모든 정점 쌍의 최단 경로를 찾는 알고리즘으로, 다익스트라 알고리즘과 함께 널리 사용됩니다.
문제
주어진 가중치 그래프에서 모든 정점 쌍의 최단 경로를 구하는 프로그램을 작성하세요.
입력
- 정점의 개수 N (1 ≤ N ≤ 100)
- 간선의 개수 M (0 ≤ M ≤ N*(N-1)/2)
- M개의 간선 정보. 각 간선은 세 개의 정수로 주어지며, 이는 시작 정점 u, 도착 정점 v, 가중치 w (1 ≤ u, v ≤ N, u ≠ v, 1 ≤ w ≤ 100)를 의미한다.
출력
- N개의 줄, 각 줄에 N개의 정수로, i번째 줄의 j번째 정수는 정점 i에서 정점 j까지의 최단 경로의 길이를 의미한다. (자기 자신으로의 경로는 항상 0이다)
풀이
플로이드-와샬 알고리즘은 다이나믹 프로그래밍 기법을 사용하여 각 정점 쌍의 최단 경로를 찾습니다. 이 알고리즘은 모든 정점 쌍에 대해 중간에 거치는 정점을 하나씩 추가해 가며 최단 경로를 갱신합니다.
다음은 C#으로 작성한 플로이드-와샬 알고리즘을 사용하여 모든 정점 쌍의 최단 경로를 구하는 코드입니다.
using System;
class Program {
static void Main(string[] args) {
int n = int.Parse(Console.ReadLine());
int m = int.Parse(Console.ReadLine());
int[,] dist = new int[n, n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) dist[i, j] = 0;
else dist[i, j] = int.MaxValue / 2; // 무한대를 의미하는 큰 값으로 초기화
}
}
for (int i = 0; i < m; i++) {
string[] input = Console.ReadLine().Split(' ');
int u = int.Parse(input[0]) - 1;
int v = int.Parse(input[1]) - 1;
int w = int.Parse(input[2]);
dist[u, v] = w;
dist[v, u] = w;
}
// 플로이드-와샬 알고리즘 수행
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dist[i, j] = Math.Min(dist[i, j], dist[i, k] + dist[k, j]);
}
}
}
// 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
Console.Write(dist[i, j] + " ");
}
Console.WriteLine();
}
}
}
이 코드는 먼저 그래프를 인접 행렬로 표현한 후, 플로이드-와샬 알고리즘을 수행하여 모든 정점 쌍의 최단 경로를 구합니다. 최종 결과를 출력하기 전까지의 모든 과정은 O(N^3)의 시간 복잡도를 가지며, 플로이드-와샬 알고리즘은 이러한 시간 복잡도를 가지는 알고리즘 중 하나입니다.
이렇게 플로이드-와샬 알고리즘을 활용하여 문제를 해결할 수 있습니다. 이 기법을 익히면 다양한 그래프 관련 문제를 쉽게 해결할 수 있으므로, 코딩 테스트 대비에 도움이 될 것입니다. 여러분도 꼭 한 번 연습해보시기 바랍니다.
이번 포스팅에서는 플로이드-와샬 알고리즘에 대해 알아보았습니다. 다음 포스팅에서는 다른 알고리즘 문제와 그에 대한 풀이 방법을 소개하겠습니다.
'Coding Test' 카테고리의 다른 글
코딩 테스트 대비: 이진 트리 순회 알고리즘 (C#) (0) | 2023.05.11 |
---|---|
코딩 테스트 대비: KMP 알고리즘을 활용한 문자열 검색 (C#) (0) | 2023.05.08 |
코딩 테스트 대비: 슬라이딩 윈도우 기법 - 연속된 구간의 최대 합 구하기 (C#) (0) | 2023.05.04 |
코딩 테스트 대비: 동적 프로그래밍 - 0-1 Knapsack Problem 풀이 (0) | 2023.04.30 |
코딩 테스트 대비: '네트워크 연결' 문제 풀이 - Kruskal 알고리즘 적용 (C#) (1) | 2023.04.28 |