수학(그래프이론)에서 그래프란, 객체 일부 쌍(pair)들이 '연관되어' 있는 객체 집합 구조를 말한다.
그래프라 하면 일반적으로 '정점(노드)'과 '간선(엣지)'으로 이루어진 자료구조를 의미한다.
또한 간선의 방향 유무에 따라서 단방향 그래프와 무방향 그래프(또는 양방향)로 나뉜다.
그래프를 표현하는 방법은 크게 인접 행렬 그래프와 인접 리스트 그래프의 두가지 방법이 있다.
모든 노드의 간선의 정보를 저장한다.
그래프의 각 정점을 방문하는 그래프 탐색(Graph Traversals)은 아래와 같이 깊이 우선 탐색(Depth-First Search, DFS), 너비 우선 탐색(Breadth-First Search, BFS), 다익스트라, 플로이드 와샬 등 크게 4가지 방법이 있다.
DFS(깊이 우선 탐색)는 19세기 프랑스의 수학자 찰스 피에르 트레모가 고안한 것으로 알려져 있으며,
일반적으로 BFS에 비해 널리 쓰인다.
(코딩테스트 시에도 대부분의 탐색은 DFS로 구현함.)
현재 정점(노드)에서 연결된 정점(노드) 하나를 골라 깊이 끝까지 탐색을 진행하여 끝까지 진행한 경우 백트래킹을 하여 다음 노드로 탐색을 진행해
아래와 예시와 같이 탐색을 한다.
DFS는 주로 스택을 통한 반복이나 재귀를 통한 반복 구조로 구현하며,
백트래킹을 통해 뛰어난 효용을 보인다.
백트래킹은 탐색을 하다가 더 갈 수 없으면 왔던 길을 되돌아가 다른 길을 찾는다는 데서 유래했다.
해결책에 대한 후보를 구축해 나아가다 가능성이 없다고 판단되는 즉시 후보를 포기(백트랙)해 정답을 찾아가는 범용적인 알고리즘으로 주로 재귀로 구현하여 모두 DFS의 범주에 속한다.
재귀는 반복되는 조건과, 종료 조건을 통해 구현하는데 이때의 종료 조건을 설정하여 재귀 호출된 함수가 종료 조건을 만족하여 탐색을 하지 않고 return 되는 것이 백트래킹이다.
제약 충족 문제(Constraint Satisfaction Problems, CSP)에 특히 유용하다.
BFS(Breadth First Search; 너비 우선 탐색)는 현재 정점과 연결된 정점들에 대해 우선적으로 넓게 탐색하는 방식이다.
최단 경로를 찾는 다익스트라 알고리즘 등에 매우 유용하게 쓰이며 큐를 통한 반복 구조로 구현하며 재귀로는 구현이 불가하다.
Reference)
파이썬 알고리즘 인터뷰
https://m.blog.naver.com/occidere/220923695595 - 그래프
1차 작성 - 22.08.22
-> 다익스트라, 플로이드 웨셜 정리 필요