그래프 탐색 알고리즘 중 하나로 한 방향으로 갈 수 있을 때까지 최대한 깊게 탐색한 후 더 이상 갈 수 없게 되면, 다시 돌아와 다음 경로를 탐색하는 방식을 의미

그래프(Graph)
정점과 간선의 집합으로 구성되어 있으며 정점은 서로 다른 정점과 연결된 구조를 가지는 형태
정점 (Vertices)
그래프에서 ‘데이터’를 나타내는 개별 요소, 노드(Node)라고도 불린다
간선(Edge)
그래프에서 ‘정점간의 관계’를 나타내는 선, 연결선이라고도 불린다
분기(Branching)
특정 노드에서 후퇴하기 전에 가능한 모든 경로를 탐색하는 과정
방문한 노드(Visited Node)
이미 탐색되어 처리된 정점
미 방문 노드(Unvisited Node)
아직 탐색되지 않은 정점
인접한 노드(Adjacent Node)
그래프에서 특정한 노드와 연결된 노드 즉, 어떤 노드와 간선(edge)으로 직접 연결되어 있는 다른 노드
- 스택(Stack) 또는 재귀(Recursion)를 사용하여 구현할 수 있다
- 탐색을 시작한 정점을 스택에 push하고, 해당 정점과 연결된 정점들을 차례로 방문
- 그래프의 구조를 재귀적으로 탐색하므로, 재귀 호출을 사용하는 경우 스택 오버플로우에 유의해야 한다
깊이우선 탐색은 한 정점에서 시작하여 최대한 깊게 탐색한 후, 더 이상 방문할 수 있는 정점이 없을 경우 이전 정점으로 돌아와 다른 경로로 탐색, 이 과정을 반복하여 그래프의 모든 정점을 탐색
- 최단 경로를 찾는 문제와는 다르게, 경로의 길이를 고려하지 않는다
- 깊이우선 탐색은 재귀적인 특성을 가지고 있어 구현이 간단

7
6
1 2
2 3
1 5
5 2
5 6
4 7
public static void dfs(
int[][] graph,
boolean[] visited,
int start
) {
Stack<Integer> stack = new Stack<>();
stack.push(start);
visited[start] = true;
System.out.println(start);
while (!stack.isEmpty()) {
int vertex = stack.pop();
for (int i = 1; i < graph.length; i++) {
if (graph[vertex][i] == 1 && !visited[i]) {
stack.push(i);
visited[i] = true;
System.out.println(i);
}
}
}
}