본문 바로가기
알고리즘 & 자료구조

Dijkstra 알고리즘

by 방구쟁이 2021. 6. 22.
728x90

목적

  • 다익스트라 알고리즘을 이해하기
  • 다익스트라 알고리즘을 Java로 구현하기

 

시작하는 말

티스토리 블로그로 이전하고 처음 포스팅하는 글입니다. 첫 게시글은 전 github.io 블로그에서 가장 클릭 수가 많았던 다익스트라 알고리즘을 옮기려고 한다. (검색어는 '다익스트라 2차원 배열')

 

다익스트라(dijkstra) 알고리즘 이란?  

다익스트라 알고리즘은 최단경로를 탐색하는 알고리즘이다. 구현 방법으로 2차원 배열 또는 힙(Heap)을 이용하여 구현할 수 있으며 각각 O(N^2)와 O(ElogN) 시간복잡도를 가진다.  

다익스트라 알고리즘은 음수 가중치를 가진 그래프에서는 사용할 수 없는 단점이 있는데 이때에는 벨만-포드 알고리즘을 사용해야 합니다.  

 

원리  

1. 모든 가중치를 무한으로 설정한다.

2. 방문하지 않은 노드는 false, 방문한 은 true로 설정한다. 하늘색 원안은 true

3. 시작점에서 연결된 노드 들의 가중치의 값을 변환한다.  

4. 그 중 가장 작은 값의 노드를 방문 한다.    

5. 방문한 곳 에서부터 연결된 노드들의 가중치를 변환한다.  

6. 그 가중치보다 다른 경로로 작은 값을 찾으면 해당 노드의 가중치를 변환하며 방문 처리를 하는 것이다.  

 

2차원 배열로 구현한 예제 (JAVA)  

private static final int MY_LOCATION = 1; //시작점
private static final int DESTINATION = 5; //목적지
private static final int START = 0;       //x
private static final int END = 1;         //y
private static final int DISTANCE = 2;    //가중치

public static int solution(int n, int[][] road) {

    int maps[][] = new int[n+1][n+1];       //Map
    int distance[] = new int[n+1];          //노드들의 가중치
    boolean[] check = new boolean[n+1];     //방문여부

    //모든 가중치 가장 큰 값으로 초기 설정
    for(int i=1; i<n+1; i++) {
      distance[i] = Integer.MAX_VALUE;
    }

	//Map 그리기
    for(int i=0; i <road.length; i++) {
      maps[road[i][START]][road[i][END]] = road[i][DISTANCE];
      maps[road[i][END]][road[i][START]] = road[i][DISTANCE];
  	}

    //시작점 셋팅
    distance[MY_LOCATION] = 0;
    check[MY_LOCATION] = true;

    //시작점에서 연결된 노드 연결
    for(int i=1;i<n+1;i++) {
      if(!check[i] && maps[MY_LOCATION][i] != 0) {//값 0 은 Null 의미
        distance[i] = maps[MY_LOCATION][i];
      }
    }

	//탐색 시작

    for(int t=0; t<n-1; t++) {
      int min_distance = Integer.MAX_VALUE;
      int min_index = -1;
      //최소값 탐색
      for(int i=1;i<n+1;i++) {
        if(!check[i] && distance[i]!=Integer.MAX_VALUE) {
          	if(distance[i]<min_distance) {
          		min_distance = distance[i];
          		min_index = i;
        	}
         }
	  }
      check[min_index] = true;    //가장 최소값 방문
         for(int i=1; i<n+1; i++) {
             if(!check[i] && maps[min_index][i] != 0) {
                 if(distance[i] > distance[min_index]+maps[min_index][i]) {
                    distance[i] = distance[min_index]+maps[min_index][i];
                 }
             }
         }
      }
      return distance[DESTINATION];
}

 

어디에 적용할까?  

다익스트라 알고리즘은 주로 그래프에서 꼭지점 간의 최단 거리를 구하는 문제에 사용된다.

 

오늘 성장에 도움을 주신 개발자분  

  출처 : https://matice.tistory.com/56

  출처2 : https://bumbums.tistory.com/4

오늘도 감사합니다.  

728x90

'알고리즘 & 자료구조' 카테고리의 다른 글

검색 알고리즘  (0) 2021.07.10
Array 배열이란?  (0) 2021.07.09
BFS 알고리즘이란?  (0) 2021.07.08
알고리즘 왜 필요할까?  (0) 2021.07.08
[Java] Queue란?  (0) 2021.07.05

댓글