Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Tree
- simulation
- Class
- Binary Search
- Binary Tree
- 코딩테스트
- Matrix
- 자바
- two pointers
- dynamic programming
- sorting
- Number Theory
- Math
- greedy
- Stack
- bit manipulation
- geometry
- 파이썬
- implement
- Data Structure
- Method
- java
- array
- hash table
- Counting
- 코테
- 구현
- SQL
- string
- database
Archives
- Today
- Total
코린이의 소소한 공부노트
Depth First Search 본문
1. Problem
- root에 대하여 깊이 우선 탐색을 실행해보자.
- 깊이 우선 탐색은 너비보다 깊이를 우선적으로 탐색하는 알고리즘이다.
- 탐색 결과는 root에서 최하단까지 갔다가 다시 root에서 다른 최하단까지 가는 형식으로 나온다.
- 주로 스택으로 구현한다.
2. Input
1) int[][] graph
- 노드 간의 연결성 표현
2) int root
- root 노드의 값
3. Output
1) root에 대하여 깊이 우선 탐색을 실행한 결과
4. Example
// 예시: 위 그래프가 주어졌을 때, 1부터 차례대로 방문한다.
// 한 번 방문한 노드는 다시 방문하지 않는다. list stack
// 첫 번째로, 1을 방문한다. [1] []
// 1과 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1] [2,3]
// 스택에서 3을 꺼낸다. [1,3] [2]
// 3과 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1,3] [2,6]
// 스택에서 6을 꺼낸다. [1,3,6] [2]
// 6과 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1,3,6] [2]
// 스택에서 2를 꺼낸다. [1,3,6,2] []
// 2와 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1,3,6,2] [4]
// 스택에서 4를 꺼낸다. [1,3,6,2,4] []
// 4와 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1,3,6,2,4] [5]
// 스택에서 5를 꺼낸다. [1,3,6,2,4,5] []
// 5와 연결 되어 있는 노드 중 방문하지 않은 노드를 스택에 넣는다. [1,3,6,2,4,5] []
// 스택이 비어있게 되면 탐색을 종료한다. [1,3,6,2,4,5]
// 같은 그래프에 대한 너비 우선 탐색의 결과 [1,2,3,4,6,5]
5. Code
// 위 그래프를 2차원 배열로 표현
// graph[i][j] == 1 if (i+1)과 (j+1)이 직접 연결되어 있다면
// == 0 if 자기 자신이라면
// == -1 if (i+1)과 (j+1)이 직접 연결되어 있지 않다면
int[][] graph = {{0,1,1,-1,-1,-1},{1,0,1,1,-1,-1},{1,1,0,-1,-1,1},
{-1,1,-1,0,1,-1},{-1,-1,-1,1,0,-1},{-1,-1,1,-1,-1,0}};
boolean[] visited = new boolean[graph.length];
Stack<Integer> s = new Stack<>();
s.add(1); // root = 1
visited[0] = true;
while(!s.empty()) {
int n = s.pop();
System.out.print(n+",");
for(int i=0 ; i<graph[n-1].length ; i++)
if(graph[n-1][i]==1 && !visited[i]) {
s.push(i+1);
visited[i] = true;
}
}
// 출력 결과: 1,3,6,2,4,5,
'Back-End > Algorithm' 카테고리의 다른 글
Kruskal algorithm (0) | 2023.06.01 |
---|---|
Union-find algorithm for graph (0) | 2023.05.31 |
Breadth First Search (0) | 2023.05.30 |
Counting sort (0) | 2023.05.24 |
Heap sort (0) | 2023.05.24 |