0. ๊ทธ๋ํ ํ์์ ๊ธฐ๋ณธ์ธ DFS์ BFS
๊ทธ๋ํ ํ์์ด๋ ๋ฌด์์ธ๊ฐ?
๊ทธ๋ํ ํ์์ด๋, ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ์์ ํน์ ์ ์ ์ ์ ํํ๊ณ , ํด๋น ์ ์ ์์ ์ธ์ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค. ์ด๋ฌํ ์ ์ ๋ฐฉ๋ฌธ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋๋ฐ, ์ด๊ฒ์ด ์์ผ๋ก ์ดํด๋ณผ DFS
์ BFS
์ด๋ค.
์ฐ๋ฆฌ๋ ์์ ๊ทธ๋ํ๋ฅผ ์์๋ก ์ฌ์ฉํ๋ฉฐ ํ๋์ฉ ์ดํดํด ๋ณด๊ฒ ๋ค.
1. DFS
DFS๋ Depth First Search์ ์ฝ์๋ก ๊น์ด ์ฐ์ ํ์์ ๋ปํ๋ค. ๋ง ๊ทธ๋๋ก ๋ฐฉ๋ฌธํ๊ธฐ๋ก ์ ํ ์ธ์ ์ ์ ์ ์ต๋ ๊น์ด๊น์ง ํ์์ ๋ง์น ํ, ๋ค์ ์ธ์ ์ ์ ์ ํ์ธํ๋ ๊ฒ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ ผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- (1) ํ์ฌ ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค.
- (2) ๋ฐฉ๋ฌธํ ์ ์ ์์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ด ์๋ค๋ฉด ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ ๋๊น์ง (1)๋ฒ์ ๋ฐ๋ณตํ๊ณ ๋ค์ ์ถ๋ฐ ์ ์ ์ผ๋ก ๋์๊ฐ๋ค.
- (3) ๋ฐฉ๋ฌธํ ์ ์ ์ ์ธ์ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธํ ์ํ๋ผ๋ฉด ์ถ๋ฐ ์ ์ ์ผ๋ก ๋ฐ๋ก ๋์๊ฐ๋ค.
(1) ์ฝ๋
์์ ์ค๋ช ์ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ฝ๋๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์๋ (a. STACK ์ด์ฉ)๊ณผ (b. ์ฌ๊ท ์ด์ฉ) ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ์ฌ์ค ์ฌ๊ท๋ Call Stack์ด๋ผ๋ Stack ์๋ฃ๊ตฌ์กฐ์ ์ํด ๊ตฌํ๋จ์ผ๋ก, ๋์ ์๋ฆฌ๋ ๋๊ฐ๋ค. ์ฌ๊ธฐ์๋ ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ๊ตฌํํด๋ณด๊ฒ ๋ค.
a. SUDO CODE
ํจ์ dfs("์ธ์ ๋ฆฌ์คํธ(lists)", "์์ ์ ์ ๋ฒํธ(S)", "๋ฐฉ๋ฌธ๋ฐฐ์ด(isVisited)")
1. ์์ ์ ์ ๋ฐฉ๋ฌธ ์ฒดํฌ
2. for(ํ ๊น์ด์ ์์์ ์ ์ ์ธ์ ์ ์ ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ๋์ฉ ์กฐํ)
if(isVisited[์กฐํํ ์ธ์ ์ ์ ] = false(๋ฏธ๋ฐฉ๋ฌธ ์ํ))
2-1 ํด๋น ์ ์ ๋ฐฉ๋ฌธ ์ฒดํฌ
2-2 ์ฌ๊ท dfs("์ธ์ ๋ฆฌ์คํธ(lists)", "๋ฐฉ๋ฌธํ ์ ์ ", "๋ฐฉ๋ฌธ ๋ฐฐ์ด");
๋ ์ด์ ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์ด ์์ผ๋ฉด ์ฌ๊ท๊ฐ ์๋ ์ข ๋ฃ๋๋ฏ๋ก ๊ธฐ์ ์กฐ๊ฑด์ ์๋ค.
b. java ์ฝ๋
๋ค์์ ์ sudo code๋ฅผ java๋ก ์ค์ฒดํํ ๋ชจ์ต์ด๋ค.
public static void dfs(ArrayList<Integer> [] lists, int now, boolean [] isVisited, StringBuilder ans) {
ans.append(now).append(" ");
isVisited[now] = true;
for (int i = 0; i < lists[now].size(); i++) {
int next = lists[now].get(i);
if(!isVisited[next]) {
dfs(lists, next, isVisited, ans);
}
}
}
ํด๋น ์ฝ๋๋ DFS์ BFS์ ํ์ด์ฝ๋ ์ค ์ผ๋ถ ์ด๊ธฐ๋ ํ๋ค. ํ ๋ฒ ์ง์ ๊ตฌํํด๋ณด์ค ๋ถ๋ค์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๊ธธ ๋ฐ๋๋ค.
(2) ์๊ฐ ๋ณต์ก๋
$$
O(V+E)
$$
V๋ ์ ์ ์ ๊ฐ์, E๋ ๊ฐ์ ์ ๊ฐ์
(3) ์๊ฒฐ
DFS๋ ๋งค์ฐ ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง, ๋ชจ๋ ๊ทธ๋ํ ๋ฌธ์ ํ์ด์ ๊ทผ๊ฐ์ด ๋๋ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ง์ ๊ทธ๋ํ ๋ฌธ์ ๊ฐ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์์ฉํด์ผ๋ง ํ ์ ์๊ฒ ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐฑํธ๋ํน๋ ์ฌ์ค DFS๋ผ๊ณ ๋ณผ ์ ์๋ค.
2. BFS
BFS๋ Breadth First Search์ ์ฝ์๋ก ๋์ด ์ฐ์ ํ์์ด๋ผ ๋ถ๋ฆฐ๋ค. ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ์ ์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ์ ์ ๋ถํฐ ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์ ์ ๋ถํฐ ํ์ํ ์ ์์๊น?
์ด๋ฅผ ์คํํ๊ธฐ ์ํด์๋ Queue๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. Queue๋ ์ ์ ์ ์ถ ์๋ฃ๊ตฌ์กฐ๋ก์จ ๋งจ ์ฒ์ ๋ฃ์๋ ๊ฐ์ด ์ ์ผ ๋จผ์ ๋์จ๋ค. ์ด๋ฅผ ํ์ฉํด ๋ค์๊ณผ ๊ฐ์ด ์งํํ๋ฉด ๋๋ค.
- (1) ์์ ์ ์ ์ ์ธ์ ์ ์ ๋ชจ๋ Queue์ ๋ฃ๊ธฐ
- (2) Queue์์ ๋จผ์ ๋์จ ๊ฐ ์ฒ๋ฆฌ ๋ฐ ํด๋น ์ ์ ์ ์ธ์ ์ ์ ๋ชจ๋ Queue์ ๋ฃ๊ธฐ
์ด๋ฌ๋ฉด, ํญ์ ์์ ์ ์ ์์ ๊ฐ๊น์ด ์ ์ ๋ถํฐ ์ฒ๋ฆฌ๋ ๊ฒ์ด๋ค. ๋ฐฉ๋ฌธ ํ๊ณ ์ถ์ ์ ์ ๋ Queue์ ๋ฃ์ด์ ์์๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋, ์ธ๋ด์ฌ์ด ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ๋ณด๋ฉด ์ข๊ฒ ๋ค.
(1) ์ฝ๋
a. SUDO CODE
bfs("์ธ์ ๋ฆฌ์คํธ[lists]", "์์ ์ ์ ", "๋ฐฉ๋ฌธ ๋ฐฐ์ด")
"Queue" (// ๋ฐฉ๋ฌธ ํ๊ณ ํ ์ ์ ๋๊ธฐ ๋ฆฌ์คํธ)
1. Queue์์ ์ ์ ํ๋ ๊บผ๋ด๊ธฐ
2. ์ ์ ์ ๋ํ ์ฒ๋ฆฌ
3. ํด๋น ์ ์ ์์ ๊ฐ ์ ์๋ ์ธ์ ์ ์ ๋ชจ๋ Queue์ ๋ฃ๊ธฐ
4. 1~3์ Queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
b. java ์ฝ๋
public static void bfs (ArrayList<Integer> [] lists, int S, StringBuilder ans){
boolean [] isVisited = new boolean[lists.length];
ArrayDeque<Integer> aq1 = new ArrayDeque<>();
aq1.add(S);
isVisited[S] = true;
while (!aq1.isEmpty()){
int qSize = aq1.size();
for (int i = 0; i < qSize; i++) {
int now = aq1.poll();
ans.append(now).append(" ");
for (int j = 0; j < lists[now].size(); j++) {
int next = lists[now].get(j);
if(!isVisited[next]){
isVisited[next] = true;
aq1.add(next);
}
}
}
}
}
ํด๋น ์ฝ๋ ์ญ์ DFS์ BFS์ ํ์ด์ฝ๋ ์ค ์ผ๋ถ์ด๋ค.
(2) ์๊ฐ ๋ณต์ก๋
$$
O(V+E)
$$
V๋ ์ ์ ์ ๊ฐ์, E๋ ๊ฐ์ ์ ๊ฐ์
(3) ์๊ฒฐ
BFS๋ฅผ ๋ณด๋ฉด, ์์ ์ ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ฐฉ๋ฌธํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์ ๊ฐ์ค์น
๊ฐ ์๋ ๊ฒฝ์ฐ, BFS๋ฅผ ํ์ฉํด ํน์ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ค.