최단 경로 알고리즘은 말 그대로 가장 짧은 경로를 찾는 알고리즘인데, 상황에 맞는 다양하고 효율적인 알고리즘이 이미 정립되어 있다.
보통 그래프로 표현함.
실제 코딩 테스트에서는 최단 경로를 모두 출력하는 문제보다는 단순히 최단 거리를 출력하도록 요구하는 문제가 많이 출제된다.
학부 수준에서 사용하는 최단 거리 알고리즘에는 3가지가 있음.
다익스트라(Dijkstra) 알고리즘
플로이드 워셜
벨만 포드 알고리즘
3가지 중 다익스트라와 플로이드 워셜 알고리즘이 코딩 테스트에서 가장 많이 등장하는 유형이다.
또한 그리디 알고리즘과 다이나믹 프로그래밍 알고리즘이 최단 경로 알고리즘에 그대로 적용된다는 특징이 있다.
특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘으로, 방문하지 않은 노드 중에서 가장 최단 거리가 짧은 노드를 선택하는 과정을 반복한다.
음의 간선(0보다 작은 값을 가지는 간선)이 없을 때 정상적으로 동작한다.
기본적으로 그리디 알고리즘으로 분류된다.
- 출발 노드를 설정한다.
- 최단 거리 테이블을 초기화한다.
- 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택한다.
- 해당 노드를 거쳐 다른 노드로 가능 비용을 계산하여 최단 거리 테이블을 갱신한다.
- 위 과정에서 3과 4를 반복한다.
최단 경로를 구하는 과정에서 각 노드에 대한 현재까지의 최단 거리 정보를 항상 1차원 리스트에 저장하며 리스트를 계속 갱신한다는 특징이 있다.
다익스트라 알고리즘을 구현하는 방법에는 2가지가 있다.
두 번째 방법을 정확히 이해하고 구현할 수 있어야 한다.
초기 상태에서는 출발 노드를 기준으로 다른 노드로 가는 최단 거리를 무한으로 초기화 한다.
단, 실수 자료형이기 때문에 모든 간선이 정수형으로 표현되는 문제에서는 int(1e9)로 초기화한다.
예: 물건 정보가 있고, 이 물건 정보는 물건의 가치와 물건의 무게로만 구성된다고 가정했을 때, 모든 물건 데이터를 (가치, 물건)으로 묶어서 우선순위 큐 자료구조에 넣을 수 있다. 이후 꺼낼 땐 항상 가치가 높은 물건이 먼저 나오게 된다(최대 힙으로 구현한 경우).
또한 일부러 우선순위에 해당하는 값에 음수 부호를 붙여 넣었다가, 나중에 우선순위 큐에서 꺼낸 다음 다시 음수 부호를 붙여 원래의 값으로 돌려놓는, 즉 최소 힙을 최대 힙처럼 사용하는 방식을 사용할 수도 있다. 이런 테크닉도 실제 코테 환경에서 자주 사용함.