DFS (Depth-First-Search) "깊이 우선 탐색이라고도 부르며, 그래프에서 깊은 부분을 우선적을 탐색하는 알고리즘"
DFS를 설명하기 전에 먼저 그래프의 기본 구조의 학습이 필요한다.
그래프는 노드와 간선으로 표현된다. 이때 노드를 정점이라고도 한다.
프로그래밍에서 그래프는 크게 2가지 방식으로 표현할 수 있는데
코딩 테스트에서는 이 두 방식 모두 필요하니 두 개념에 대해 바르게 알고 있도록 하자.
1) 인접행렬 (Adjacency Matrix) : 2차원 배열로 그래프의 연결 관계를 표현하는 방식
2) 인접 리스트 (Adjacency List) : 리스트로 그래프의 연결 관계를 표현하는 방식
인접행렬 방식은 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식이다.
*다른 언어의 배열을 파이썬에서는 리스트 자료형으로 표현 가능하다.
노드1 ----------- 노드0------------노드2
간선7 간선5
0 | 1 | 2 | |
0 | 0 | 7 | 5 |
1 | 7 | 0 | 무한 |
2 | 5 | 무한 | 0 |
인접행렬 예시 코드
inf = 99999999999
graph=[
[0, 7, 5],
[7, 0, inf],
[5, inf, 0]
]
print(graph)
인접 리스트 방식에서는 모든 노드에 연결된 노드에 대한 정보를 차례대로 연결하여 저장한다.
노드0 ----->노드1 (간선7)
노드0 ----->노드2 (간선5)
노드1 ----->노드0 (간선7)
노드2 ----->노드0 (간선5)
#행(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)
[[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]] ---> 결과 안에 튜플 형태로 저장된다.
두 방식의 차이점
1) 인접 행렬 방식은 모든 관계를 저장하므로 노드 개수가 많을 수록 메모리가 불필요하게 낭비된다.
2) 반면, 인접리스트 방식은 연결된 정보만 저장하기 때문에 메모리가 효율적
3) 하지만, 인접 리스트 방식은 인접 행렬 방식에 비해 특정한 두 노드가 연결되어 있는지에 대한 정보를
얻는 속도가 느림. 인접 리스트 방식에서는 연결된 데이터를 하나씩 확인해야하기 때문
예시)
한 그래프에서 노드 1과 노드 7이 연결 되었는 상황에서
인접 행렬 방식으로는 graph[1][7]만 확인하면 됨 하지만, 인접 리스트 방식에서는 노드 1에 대한 인접 리스트를 앞에서부터 차례로 확인해야한다.
그러므로, 특정한 노드와 연결된 모든 인접 노드를 순회해야한는 경우, 인접 리스트 방식이 인접 행렬 방식에 비해 메모리 공간의 낭비가 적다.
'알고리즘 공부' 카테고리의 다른 글
범위를 좁혀가는 탐색 (0) | 2021.04.01 |
---|---|
구현 "머릿속에 있는 알고리즘을 정확하고 빠르게 프로그램으로 작성하기" (0) | 2021.03.30 |