현대 사회에서 대중교통은 중요한 역할을 하고 있으며, 특히 버스를 이용하는 경우 많은 사람들이 최적의 노선을 찾는 데 어려움을 겪곤 합니다. 이번 강좌에서는 가장 빠른 버스 노선 구하기 문제를 해결하는 과정을 살펴보겠습니다. 이 문제를 해결하기 위해 C#을 사용하여 알고리즘과 데이터 구조를 활용할 것입니다.
문제 정의
주어진 여러 개의 버스 노선과 각 노선의 소요 시간을 바탕으로 시작 지점에서 목적지까지 이동하는 가장 빠른 경로를 구하는 문제입니다.
다음과 같은 입력값을 가집니다:
- 정점 (Vertex): 버스 정류장
- 간선 (Edge): 버스 노선
- 가중치 (Weight): 소요 시간
입력 예시
5 6 1 2 3 1 3 2 2 3 1 1 4 1 2 4 5 3 5 1
여기서 첫 줄은 정점과 간선의 개수를 나타내며, 다음 각 줄은 정류장 간의 관계와 소요 시간을 보여줍니다.
문제 해결 과정
1단계: 그래프 모델링
위 문제를 해결하기 위해, 버스 정류장을 정점으로 하고, 버스 노선과 소요 시간을 간선으로 하는 그래프를 구성해야 합니다.
이를 위해, 각 정류장과 그 간선의 정보를 담은 인접 리스트를 생성합니다.
2단계: 최단 경로 알고리즘 선택
최단 경로를 찾기 위해 여러 알고리즘이 있지만, 가중치가 있는 간선이 있을 때는 Dijkstra 알고리즘을 사용하는 것이 적합합니다.
Dijkstra 알고리즘은 각 정점까지의 최단 거리를 효과적으로 계산할 수 있는 방법입니다.
3단계: C# 코드 구현
자, 이제 위 내용을 바탕으로 C# 코드를 작성해 보겠습니다. 아래 코드는 Dijkstra 알고리즘을 구현하여 주어진 그래프에서 최단 경로를 찾는 방법을 보여줍니다.
using System; using System.Collections.Generic; class Program { static void Main(string[] args) { int vertexCount = 5; // 정점의 수 int[,] graph = new int[vertexCount + 1, vertexCount + 1]; for (int i = 1; i <= vertexCount; i++) for (int j = 1; j <= vertexCount; j++) graph[i, j] = (i == j) ? 0 : int.MaxValue; // 간선 추가 (소요 시간) graph[1, 2] = 3; graph[1, 3] = 2; graph[2, 3] = 1; graph[1, 4] = 1; graph[2, 4] = 5; graph[3, 5] = 1; // Dijkstra 알고리즘 호출 int[] shortestPath = Dijkstra(graph, vertexCount, 1); // 결과 출력 Console.WriteLine("정점 1에서 다른 정점까지의 최단 거리:"); for (int i = 1; i <= vertexCount; i++) { Console.WriteLine($"정점 1 -> 정점 {i}: {(shortestPath[i] == int.MaxValue ? "도달할 수 없음" : shortestPath[i].ToString())}"); } } static int[] Dijkstra(int[,] graph, int vertexCount, int start) { bool[] visited = new bool[vertexCount + 1]; int[] distance = new int[vertexCount + 1]; for (int i = 1; i <= vertexCount; i++) { distance[i] = (i == start) ? 0 : int.MaxValue; } for (int count = 0; count < vertexCount - 1; count++) { int u = MinDistance(distance, visited, vertexCount); visited[u] = true; for (int v = 1; v <= vertexCount; v++) { if (!visited[v] && graph[u, v] != int.MaxValue && distance[u] != int.MaxValue && distance[u] + graph[u, v] < distance[v]) { distance[v] = distance[u] + graph[u, v]; } } } return distance; } static int MinDistance(int[] distance, bool[] visited, int vertexCount) { int min = int.MaxValue; int minIndex = -1; for (int v = 1; v <= vertexCount; v++) { if (!visited[v] && distance[v] <= min) { min = distance[v]; minIndex = v; } } return minIndex; } }
4단계: 시간 복잡도 분석
Dijkstra 알고리즘의 시간 복잡도는 O(V^2)
입니다. 여기서 V
는 정점의 수를 의미합니다.
따라서 정점의 수가 많은 경우, 더 효율적인 방법인 우선순위 큐를 사용한 개선된 Dijkstra 알고리즘을 고려할 수 있습니다.
마무리
이번 강좌에서는 C#을 사용하여 가장 빠른 버스 노선 구하기 문제를 해결하기 위해 Dijkstra 알고리즘을 구현해 보았습니다.
실제 코딩 테스트나 취업 면접에서 유사한 문제가 출제될 수 있으므로, 이 알고리즘을 충분히 이해하고 연습하는 것이 중요합니다.
앞으로도 다양한 알고리즘 문제와 해결 방법을 지속적으로 공부해 나가길 바랍니다. 추가로 궁금한 점이나 알고리즘 관련 문제는 언제든지 질문해 주세요!