노드와 간선
그래프는 노드Node와 간선Edge으로 표현되며 이때 노드를 정점Vertex이라고도 말한다. 그래프 탐색이란 하나의 노드를 시작으로 다수의 노드를 방문하는 것을 말한다. 또한 두 노드가 간선으로 연결되어 있다면 ‘두 노드는 인접하다Adjacent‘라고 표현한다.
노드를 도시, 간선을 도로라고 생각해보자. A라는 도시(노드)에서 B라는 도시(노드)로 이동하기 위해서, A와 B를 연결하는 도로(간선)를 거친다고 이해하면 쉬울 것이다.
인접 행렬과 인접 리스트 개념
프로그래밍에서 그래프는 크게 2가지 방식으로 표현할 수 있다.
- 인접 행렬(Adjacency Matrix): 2차원 배열로 그래프의 연결 관계를 표현하는 방식
- 인접 리스트(Adjacency List): 리스트로 그래프의 연결 관계를 표현하는 방식
먼저 인접 행렬은 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식이다. 연결이 되어 있지 않은 노드끼리는 무한의 비용이라고 작성한다.
인접 리스트 방식에서는 다음 그림처럼 모든 노드에 연결된 노드에 대한 정보를 차례대로 연결하여 저장한다.
인접 행렬과 인접 리스트 방식을 코드로 비교해보면 아래와 같다.
[인접 행렬 방식 예제]
INF = 999999999 # 무한의 비용 선언
# 2차원 리스트를 이용해 인접 행렬 표현
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0],
]
print(graph)
[인접 리스트 방식 예제]
# 행(Row)이 3개인 2차원 리스트로 인접 리스트 표현
graph = [[] for _ in range(3)]
# 노드 0에 연결된 노드 정보 저장(노드 거리)
graph[0].append((1, 7))
graph[0].append((2, 5))
# 노드 1에 연결된 노드 정보 저장(노드, 거리)
graph[1].append((0, 7))
# 노드 2에 연결된 노드 정보 저장(노드, 거리)
graph[2].append((0, 5))
print(graph)
인접 행렬과 인접 리스트 차이
[메모리 측면]
- 인접 행렬 방식
- 모든 관계를 저장하므로 노드 개수가 많을수록 메모리가 불필요하게 낭비됨
- 인접 리스트 방식
- 연결된 정보만을 저장하기 떄문에 메모리를 효율적으로 사용
- 하지만 이와 같은 속성 때문에 인접 행렬 방식에 비해 특정한 두 노드가 연결되어 있는지에 대한 정보를 얻는 속도가 느림. 인접 리스트 방식에서는 연결된 데이터를 하나씩 확인해야 하기 때문
ref
이것이 취업을 위한 코딩 테스트다 with 파이썬
나동빈 유튜브 강의