ํ์ ์๊ณ ๋ฆฌ์ฆ
์ด๋ฒ ์ฃผ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ธ ๋ ๊ฐ์ง DFS
์ BFS
์ ๊ณต๋ถํ ์์ ์ด๋ค.
๋จผ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ง ๊ทธ๋ํ์ ๋
ธ๋ ๊ทธ๋ฆฌ๊ณ ๋
ธ๋์ ๋
ธ๋ ์ฌ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ์ํ๋ฅผ ํ์
ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
๋จผ์ , ๊ทธ๋ํ๋ฅผ ๋ฐ์ดํฐ๋ก ๊ตฌํํ๊ธฐ ์ํด์๋ ๋จผ์ ํ
์ด๋ธ์ ๋ํ ์ดํด๊ฐ ์์ด์ผ ํ๋ฉฐ, ์ด๋ ์ธ์ ํ๋ ฌ
๋๋ ์ธ์ ๋ฆฌ์คํธ
๋ฅผ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
Graph
์ธ์ ํ๋ ฌ
์ธ์ ํ๋ ฌ์ด๋ ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํํ๋ ๋ฐฉ์์ ๋งํ๋ค.
์ฆ, ๋
ธ๋์ ๊ฐ์๋ ์ด๋ฏธ ์ ํด์ ธ ์์ผ๋ ๊ฐ ๋
ธ๋(x์ถ index ๋ฒํธ)์ ๋
ธ๋(y์ถ index ๋ฒํธ) ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ฐ์ดํฐ๋ก ์ ์ฅํด ํ
์ด๋ธ๋ก ๊ตฌํํ๋ค๋ ์๋ฏธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ์ ํ๋ ฌ์ ๊ฐ๊ฐ์ ๋
ธ๋ ๊ฐ ๊ด๊ณ๋ฅผ(๋
ผ๋ฆฌ ํน์ 0,1) ํ์
ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.(n ~ m๊น์ง ๋ชจ๋ ๋ฐฐ์ด์ ๋ฐฉ์ ๊ด๊ณ๋ฅผ ํ์
ํ๋ค.)
ํ์ง๋ง V๊ฐ์ ๋ ธ๋์ E๊ฐ์ ๊ฐ์ ์ด ์กด์ฌํ ๋ E๊ฐ์ ๊ฐ์ ์ ํ์ ํ๊ธฐ ์ํด์๋ n ~ V๊น์ง ๋ฐฐ์ด์ ๋ฐฉ์ ํ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ O(V) ๋งํผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ์ฆ, ๋ถํ์ํ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๋ค๋ ๋จ์ ์ด ์๋ค.
์ธ์ ๋ฆฌ์คํธ
์ธ์ ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ ์๋ฃํ์ ์ด์ฉํด ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ธ์ ํ๋ ฌ์ด V๊ฐ์ ๋
ธ๋์์ E๊ฐ์ ๊ฐ์ ์ ํ์
ํ๊ธฐ ์ํด O(V)๋งํผ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ๋จ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ณ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ๊ฐ ๋ฆฌ์คํธ์ index๋ฅผ ๋
ธ๋๋ผ๊ณ ๊ฐ์ ํ๊ณ ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ธ๋ฑ์ค์ ๊ธธ์ด๋ ํด๋น ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋์ ๋ํ ๊ฐ์ ์ ๊ฐ์๋ผ๋ ๋ป์ด๋ค.
ํ์ด์ฌ์ ๊ฒฝ์ฐ ์์ฒด์์ ์ ๊ณตํ๋ ๋ฆฌ์คํธ ์๋ฃํ์ ์ด์ฉํด append() ํจ์๋ฅผ ํ์ฉํ์ฌ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, C๋ JAVA์ ๊ฐ์ ์ธ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ List ํด๋์ค๋ฅผ ํธ์ถํ์ฌ ๊ตฌํํ ์ ์๋ค.
DFS - ๊น์ด ์ฐ์ ํ์
DFS(Depth First Search), ๊น์ด ์ฐ์ ํ์์ด๋ ํ์ฌ์ ๋ ธ๋(ํน์ ๋ฃจํธ ๋ ธ๋)์ ์ธ์ ํ ๋ ธ๋๋ค์ ํน์ ํ ๊ธฐ์ค(ex.๋ ธ๋์ ๋ฒํธ๊ฐ ์์ ์์๋๋ก)์ผ๋ก ์ธ์ ํ ๋ ธ๋์ ์ ์ผ ๊น์ ๊ณณ๊น์ง ํ์ํ๋ฉฐ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ DFS๋ Stack ์๋ฃ ๊ตฌ์กฐ๋ ์ฌ๊ท ํจ์๋ฅผ ํตํด ๊ตฌํํ ์ ์์ผ๋ฉฐ ๋ณดํต์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํด ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- Python - ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์ฝ๋
# DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# JAVA : stack.push()
# Python : stack.append()
# ํ์ฌ์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[v] = True
print(v, end=' ')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
dfs(graph, 1, visited)
- JAVA - DFS๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ ๋ฌธ์ ํด๊ฒฐ ์ฝ๋
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_4์ฃผ์ฐจ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class ๋ฐ์ด๋ฌ์ค_2606 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n;
static int m;
static int count;
static boolean[][] graph;
static boolean[] visited;
public static void dfs(int index) {
visited[index] = true;
for (int i = 1; i <= n; i++) {
if (graph[index][i] == true && visited[i] == false) {
count++;
dfs(i);
}
}
}
public static void main(String[] args) throws IOException {
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
graph = new boolean[n + 1][n + 1];
visited = new boolean[n + 1];
for (int i = 1; i <= m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x][y] = true;
graph[y][x] = true;
}
dfs(1);
System.out.println(count);
}
}
๊น์ด ์ฐ์ ํ์์ ๊ฒฝ์ฐ ๋ชจ๋ ๋
ธ๋ ๊ฐ ๊ฐ์ ์ ์กฐํํ๋ค.
๋ฐ๋ผ์,
- ์ธ์ ๋ฆฌ์คํธ
- O(N + E)
- ์ธ์ ํ๋ ฌ
- O(N^2)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ฒด๋ฅผ ํ์ํ๋ ๊น์ด ์ฐ์ ํ์์ ๋๋น ์ฐ์ ํ์๋ณด๋ค ๋๋ฆฌ๋ค.
BFS - ๋๋น ์ฐ์ ํ์
BFS(Breadth First Search), ๋๋น ์ฐ์ ํ์์ด๋ ํ์ฌ์ ๋ ธ๋(ํน์ ๋ฃจํธ ๋ ธ๋)์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๊ณ , ์ธ์ ํ ๋ ธ๋๋ฅผ ํน์ ๊ธฐ์ค์ ์์๋๋ก ๋ค์ ์ธ์ ๋ ธ๋์ ์ธ์ ๋ ธ๋๋ฅผ ํ์ํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ BFS๋ Queue ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
๋ฐ๋ผ์, ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฐฉ๋ฌธํ ๋
ธ๋์ ๋ํด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํด์ผ ๋ค์ ๋
ธ๋์ ํ์์ ์งํํ ์ ์๋ค๋ ์ ์ด๋ค.
- Python - deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ตฌํ
# BFS ๋๋น ์ฐ์ ํ์์ ํ์ ๋ค์ค ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
from collections import deque
def bfs_function(graph, start, visited):
# ํ ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False] * 9
bfs_function(graph, 1, visited)
- JAVA - ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ Queue ํด๋์ค๋ฅผ ์ด์ฉํด ๊ตฌํ
package ์ฌ์ฑํ.์๊ณ ๋ฆฌ์ฆ_4์ฃผ์ฐจ;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
public class BFS_๋๋น์ฐ์ ํ์ {
static Queue<Integer> queue = new LinkedList<Integer>();
public static void dfs(int[][] graph, int start, boolean[] visited) {
queue.offer(start);
visited[start] = true;
while (queue.size() != 0) {
int save = queue.poll();
System.out.print(save + " ");
for (int i = 0; i < graph[save].length; i++) {
if (!visited[graph[save][i]]) {
queue.offer(graph[save][i]);
visited[graph[save][i]] = true;
}
}
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
int[][] graph = { {}, { 2, 3, 8 }, { 1, 7 }, { 1, 4, 5 }, { 3, 5 }, { 3, 4 }, { 7 }, { 2, 6, 8 }, { 1, 7 } };
boolean[] visited = new boolean[graph.length + 1];
for (int i = 1; i < visited.length; i++) {
visited[i] = false;
}
dfs(graph, 1, visited);
}
}
๋๋น ์ฐ์ ํ์๋
- ์ธ์ ๋ฆฌ์คํธ
- O(N + E)
- ์ธ์ ํ๋ ฌ
- O(N^2)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
์ฐธ๊ณ ํ๋ฉด ์ข์ ์์
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2667 | DFS, ๋จ์ง ๋ฒํธ ๋ถ์ด๊ธฐ (0) | 2020.11.02 |
---|---|
๋ฐฑ์ค 2138 | ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ์ ๊ตฌ์ ์ค์์น (0) | 2020.11.01 |
๋ฐฑ์ค 11729 | ์ฌ๊ท ํจ์, ํ๋ ธ์ด์ ํ ์ด๋ ์์ (2) | 2020.10.18 |
๋ฐฑ์ค 5585 | ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ, ๊ฑฐ์ค๋ฆ ๋ (0) | 2020.10.18 |
๋ฐฑ์ค 7568 | ๋ธ๋ฃจํธ ํฌ์ค ์๊ณ ๋ฆฌ์ฆ, ๋ฉ์น (0) | 2020.10.18 |