- 발행일
코딩 테스트 개요 및 문제 풀이를 위한 자바스크립트 문법 06
코딩 테스트 개요 및 문제 풀이를 위한 자바스크립트 문법 06
이 글은 네이버 블로그에 2024년 2월 4일에 올렸던 것을 그대로 옮겨온 것입니다.
1. 다익스트라 알고리즘
다익스트라 알고리즘은 가중치가 있는 그래프에서 한 노드에서 다른 모든 노드까지의 최단 경로를 찾는 알고리즘입니다. 이 알고리즘은 음의 가중치를 갖는 간선이 없을 때 사용할 수 있습니다.
작동 원리:
- 출발 노드를 설정하고, 출발 노드로부터 각 노드까지의 거리를 저장하는 배열을 무한대로 초기화합니다. 출발 노드의 거리는 0으로 설정합니다.
- 아직 방문하지 않은 노드 중에서 가장 가까운 노드를 선택합니다.
- 선택한 노드를 통해 다른 노드로 가는 거리를 계산하고, 기존에 저장된 거리보다 작으면 업데이트합니다.
- 모든 노드를 방문할 때까지 2와 3의 과정을 반복합니다.
2. 플로이드 워셜 알고리즘
플로이드 워셜 알고리즘은 모든 쌍의 노드 사이의 최단 경로를 찾는 알고리즘입니다. 이 알고리즘은 가중치가 음수일 때도 사용할 수 있지만, 음의 순환(cycle)이 없어야 합니다.
작동 원리:
- 모든 노드 쌍에 대한 최단 거리를 저장할 2차원 배열을 초기화합니다. 자기 자신으로 가는 거리는 0으로, 나머지는 무한대로 설정합니다.
- 모든 간선에 대해, 두 노드 사이의 거리를 간선의 가중치로 설정합니다.
- 각 노드를 거쳐가는 경우를 고려하여 모든 노드 쌍의 최단 거리를 업데이트합니다. 이때, dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) 공식을 사용합니다.
- 모든 노드 쌍에 대해 3의 과정을 반복합니다.
3. 벨만 포드 알고리즘
벨만 포드 알고리즘은 다익스트라 알고리즘과 유사하게 한 노드에서 다른 모든 노드까지의 최단 경로를 찾지만, 음의 가중치를 가진 간선이 있을 때도 사용할 수 있습니다. 또한, 음의 순환을 감지할 수 있습니다.
작동 원리:
- 출발 노드로부터 각 노드까지의 거리를 저장하는 배열을 무한대로 초기화하고, 출발 노드의 거리는 0으로 설정합니다.
- 모든 간선에 대해, 만약 해당 간선을 거치는 것이 더 짧은 경로를 제공한다면, 해당 노드까지의 거리를 업데이트합니다.
- 2의 과정을 노드의 수 - 1번 반복합니다. 이는 최악의 경우 모든 노드를 거쳐가는 경우를 고려줍니다. 4. 음의 순환을 감지하기 위해, 모든 간선에 대해 한 번 더 거리 업데이트 시도를 합니다. 이 때 거리가 업데이트되면 그래프에 음의 순환(cycle)이 존재하는 것입니다.
1. 다익스트라 알고리즘 예시
문제: 도시 A에서 도시 F까지 가는 최단 경로를 찾으려고 합니다. 각 도시 간의 거리는 다음과 같습니다.
- A → B: 4
- A → C: 2
- B → C: 5
- B → D: 10
- C → E: 3
- D → F: 11
- E → D: 4
해결:
- 출발점 A에서 출발하여, A에서 각 도시까지의 초기 거리를 무한대로 설정합니다(단, A의 거리는 0).
- A에서 직접 연결된 도시 B와 C의 거리를 갱신합니다(A → B: 4, A → C: 2).
- 가장 가까운 도시 C를 선택하고, C를 통해 다른 도시로 가는 거리를 계산하여 필요한 경우 거리를 갱신합니다(C → E: 2 + 3 = 5).
- 다음으로 B와 E를 거쳐 나머지 도시들의 거리를 갱신합니다.
- 이 과정을 반복하며, 각 단계에서 최단 거리를 갖는 도시를 선택하고 거리를 갱신합니다.
- 최종적으로 A에서 F까지의 최단 거리를 찾습니다.
2. 플로이드 워셜 알고리즘 예시
문제: 세 개의 도시 A, B, C가 있고, 각 도시 간의 거리는 다음과 같습니다.
- A → B: 5
- B → C: 3
- C → A: 2
해결:
- 모든 도시 쌍(A, B, C)에 대해 최단 거리를 초기화합니다. 직접 연결되지 않은 도시의 거리는 무한대로 설정합니다.
- 각 도시를 거쳐 가는 경로를 고려하여 거리를 업데이트합니다. 예를 들어, A → B → C의 경로를 확인하고, A → C보다 짧은 경우 거리를 업데이트합니다.
- 모든 도시를 거쳐 가는 모든 가능한 경로를 고려하여 최종 거리를 계산합니다.
3. 벨만 포드 알고리즘 예시
문제: 도시 A에서 출발하여 다른 도시로 가는 최단 경로를 찾으려고 합니다. 도시 간의 거리는 다음과 같으며, 일부는 음의 가중치를 갖습니다.
- A → B: 4
- A → C: 5
- B → C: -7
- C → B: 2
해결:
- A에서 각 도시까지의 거리를 무한대로 초기화하고, A의 거리는 0으로 설정합니다.
- 각 간선에 대해 거리를 업데이트합니다. 예를 들어, A → B는 4, A → C는 5로 설정합니다.
- 모든 간선을 다시 검사하며, B → C를 거쳐 A → C로 가는 경로가 더 짧은지 확인합니다. 이 경우, A → B → C 경로가 A → C 직접 경로보다 2만큼 더 짧게 됩니다.
- 모든 간선에 대해 이 과정을 반복하며, 음의 순환을 감지할 수 있습니다. 이 예에서는 음의 순환(B → C → B)이 발생합니다.