2024년 9월 22일

그래프 기본 - 그래프를 코드로 표현하기

 

그래프 종류

  • 방향 그래프
    • 간선의 방향이 한 방향으로 정해져 있는 그래프
    • notion image
  • 양방향 그래프
    • 간선의 방향이 양방향인 그래프
    • notion image
  • 가중 그래프
    • 간선에 가중치가 존재하는 그래프
    • notion image
 

그래프를 코드로 표현하는 방법 3가지

  1. 인접 리스트 (Adjacency List)
      • 각 노드를 기준으로 연결된 노드를 저장하는 방식
      더 보기
      • 그래프
        • notion image
      • 인접 리스트로 표현
        • notion image
       
      예제 코드
      adj_list = [[] for _ in range(4)] adj_list[0].append(1); adj_list[0].append(2) adj_list[1].append(3) adj_list[2].append(3) adj_list[3].append(0) print(adj_list)
       
      • 양방향 그래프인 경우에는 하나의 간선을 간선 2개로 생각하면 된다.
        • notion image
       
      • 가중 그래프인 경우에는 (연결된 노드, 간선의 가중치) 형태로 저장하면 된다.
       
  1. 인접 행렬 (Adjacency Matrix)
      • (노드의 개수) x (노드의 개수) 형태의 행렬을 만든 후에 간선을 표현하는 방식
      더 보기
      • 그래프
        • notion image
      • 인접 행렬로 표현
        • notion image
       
      예제 코드
      adj_matrix = [[0 for _ in range(4)] for _ in range(4)] adj_matrix[0][1] = 1; adj_matrix[0][2] = 1 adj_matrix[1][3] = 1 adj_matrix[2][3] = 1 adj_matrix[3][0] = 1 print(adj_matrix)
       
      • 양방향 그래프인 경우에는 하나의 간선을 간선 2개로 생각하면 된다.
        • notion image
       
      • 가중 그래프인 경우에는 간선이 존재하는 경우 1이 아닌 가중치를 저장하면 된다.
       
  1. 간선 리스트 (Edge List)
      • 간선의 정보만을 간단히 표현하는 방식으로, 간선 1개당 노드 2개로 표현하는 방식
      더 보기
      • 그래프
        • notion image
       
      • 간선 리스트로 표현
        • notion image
       
      예제 코드
      edge_list = [] edge_list.append([0, 1]) edge_list.append([0, 2]) edge_list.append([1, 3]) edge_list.append([2, 3]) edge_list.append([3, 0]) print(edge_list)
       
      • 양방향 그래프인 경우에는 하나의 간선을 간선 2개로 생각하면 된다.
        • notion image
       
      • 가중 그래프인 경우에는 (노드 A, 노드 B, 간선의 가중치) 형태로 저장하면 된다.
 

내용 정리

  • 인접 리스트
    • 그래프를 코드로 표현할 때 이 방법을 기본(default)로 생각하면 된다.
      • 어떤 노드와 연결된 노드들을 쉽게 접근할 수 있다.
      • 따라서, 그래프 순회(탐색)에 사용하기에 적합한 형식이다.
    • 최단 경로 알고리즘의 다익스트라 알고리즘을 구현할 때에 쓰인다.
 
  • 인접 행렬
    • 어떤 노드 A에서 B로 가는 간선을 확인해야 하는 작업이 많은 경우에 사용하면 된다.
      • adj_matrix[A][B] 를 접근하면 되기 때문에 에 확인할 수 있다.
    • 최단 경로 알고리즘의 플로이드 워셜 알고리즘을 구현할 때에 쓰인다.
 
  • 간선 리스트
    • 간선들을 기준으로 무언가를 처리해야할 때 사용하면 된다.
    • 최단 경로 알고리즘의 벨만-포드를 구현할 때에 쓰인다.
 
인접 행렬과 간선 리스트는 플로이드-워셜 알고리즘, 벨만-포드 알고리즘을 사용하는 것이 아니면 거의 쓸 일이 없다.