ALGORITHM_BFS & DFS
๐ ALGORITHM
๐ BFS & DFS
BFS ( Breadth First Search )์ด๋ ๋ฌด์์ธ๊ฐ ?
๋ฃจํธ ๋
ธ๋์ ์์ ๋
ธ๋ค๋ค์ ๋จผ์ ๋ชจ๋ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธํ ํ์, ๋ฐฉ๋ฌธํ๋ ์์ ๋
ธ๋๋ค์ ๊ธฐ์ค์ผ๋ก ํ์ฌ ๋ค์ ํด๋น ๋
ธ๋์ ์์ ๋
ธ๋๋ค์ ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ด๋ค.
์ต๋ํ ๋๊ฒ ์ด๋ํ ๋ค์, ๋ ์ด์ ๊ฐ ์ ์์ ๋ ์๋๋ก ์ด๋ํ๋ค.
๋๋น ์ฐ์ ํ์์ด๋ผ ํ๋ค.
์ธ์ ํ ๋
ธ๋๋ค์ ๋ํด ํ์์ ํ ํ, ์ฐจ๋ก๋ก ๋ค์ ๋๋น์ฐ์ ํ์์ ์งํํด์ผ ํ๋ฏ๋ก
์ ์
์ ์ถ ํํ์ ์๋ฃ๊ตฌ์กฐ์ธ ํ๋ฅผ ํ์ฉํ๋ค !!
BFS๋ฅผ ํ์ฉํ ๋ฌธ์ ์ ํ
- ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ฃผ์ํ ๋ฌธ์
- ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋ ๋ฌธ์
- ๊ฒ์ ๋์์ ๊ท๋ชจ๊ฐ ํฌ์ง ์๊ณ , ๊ฒ์ ์์ ์์ ์ผ๋ก๋ถํฐ ์ํ๋ ๋์์ด ๋ณ๋ก ๋ฉ์ง ์์ ๊ฒฝ์ฐ
BFS ์๊ณ ๋ฆฌ์ฆ
ํ๋ฅผ ์ฌ์ฉํด ๋
ธ๋๋ค์ ์ฝ์
, ๋ฐํ ํ๊ณ
boolean์ ์ด์ฉํด ๋ฐฉ๋ฌธํ๋ ๊ณณ์ธ์ง ์๋์ง ํ๋จํ๋ค.
- ํ์ฌ ๋ ธ๋๋ฅผ ํ์ ์ฝ์
- while๋ฌธ ์์ฑ ( ์ข ๋ฃ ์กฐ๊ฑด : ํ๊ฐ ๋น์ด ์์ ๊ฒฝ์ฐ )
- x <- ํ์ ์ฒซ ๋ฒ์งธ ๋ ธ๋ ๋ฐํ ( offer )
- x ์คํ ( ๋ฌธ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฆ )
- x์ ์์๋ ธ๋๋ค ํ์ ์ฝ์ ( push )
- while๋ฌธ ๋ฐ๋ณต
BFS ์ค์ต ํด๋ณด์ฆ์ !
import java.util.*;
public class Main {
public static boolean[] visited = new boolean[9];
public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
// BFS ํจ์ ์ ์
public static void bfs(int start) {
Queue<Integer> q = new LinkedList<>();
q.offer(start);
// ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = true;
// ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while(!q.isEmpty()) {
// ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅ
int x = q.poll();
System.out.print(x + " ");
// ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์
for(int i = 0; i < graph.get(x).size(); i++) {
int y = graph.get(x).get(i);
if(!visited[y]) {
q.offer(y);
visited[y] = true;
}
}
}
}
public static void main(String[] args) {
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < 9; i++) {
graph.add(new ArrayList<Integer>());
}
// ๋
ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(1).add(8);
// ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(2).add(1);
graph.get(2).add(7);
// ๋
ธ๋ 3์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(3).add(1);
graph.get(3).add(4);
graph.get(3).add(5);
// ๋
ธ๋ 4์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(4).add(3);
graph.get(4).add(5);
// ๋
ธ๋ 5์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(5).add(3);
graph.get(5).add(4);
// ๋
ธ๋ 6์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(6).add(7);
// ๋
ธ๋ 7์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(7).add(2);
graph.get(7).add(6);
graph.get(7).add(8);
// ๋
ธ๋ 8์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(8).add(1);
graph.get(8).add(7);
bfs(1);
}
}
1 2 3 8 7 4 5 6
DFS์ด๋ ๋ฌด์์ธ๊ฐ ?
๋ฃจํธ ๋
ธ๋์์ ์ถ๋ฐํ์ฌ ํ ๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒฝ๋ก๊ฐ ์๋ ๊ณณ๊น์ง ๊น์ด ํ์ํด ๊ฐ๋ค๊ฐ ๋ ์ด์ ๊ฐ ๊ณณ์ด ์๊ฒ ๋๋ฉด, ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ง๋ฌ๋ ๊ฐ๋ฆผ๊ธธ ๊ฐ์ ์ด ์๋ ๋
ธ๋๋ก ๋๋์์์ ๋ค๋ฅธ ๋ฐฉํฅ์ ๋
ธ๋๋ก ํ์์ ๋ฐ๋ณตํ์ฌ ๊ฒฐ๊ตญ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ์ํ๋ฐฉ๋ฒ์ด๋ค.
์ต๋ํ ๊น์ด ๋ด๋ ค๊ฐ ๋ค, ๋์ด์ ๊น์ด ๊ฐ ๊ณณ์ด ์์ ๊ฒฝ์ฐ ์์ผ๋ก ์ด๋ํ๋ค.
๊น์ด ์ฐ์ ํ์์ด๋ผ ํ๋ค.
๊ฐ์ฅ ๋ง์ง๋ง์ ๋ง๋ฌ๋ ๊ฐ๋ฆผ๊ธธ์ ๋
ธ๋๋ก ๋๋์๊ฐ์ ๋ค์ ๊น์ด ์ฐ์ ํ์์ ๋ฐ๋ณตํด์ผ ํ๋ฏ๋ก ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๊ฑฐ๋ ํ์
์ ์ถ ๊ตฌ์กฐ์ ์คํ์ ํ์ฉํ๋ค !!
์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ณดํธ์ ์ด๋ก ์งง์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์ฌ๊ท ํธ์ถ์ด ์ค๋จ๋๋ ์กฐ๊ฑด์ธ ๊ธฐ์ ์กฐ๊ฑด์ ๋ฐ๋์ ํฌํจํด์ผ ํ๋ค.
DFS๋ฅผ ํ์ฉํ ๋ฌธ์ ์ ํ
- ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์ฃผ์ํ ๋ฌธ์
- ๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด๋ฌ์ผ ํ๋ ๋ฌธ์
- ๊ฒ์ ๋์ ๊ทธ๋ํ๊ฐ ์ ๋ง ํฌ๋ค๋ฉด DFS๋ฅผ ๊ณ ๋ ค
DFS ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ฅ ๋ณดํธ์ ์ธ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ์ค์ตํด ๋ณด๊ฒ ๋ค.
- ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ
- for๋ฌธ์ ํตํด ๋ชจ๋ ์์๋ ธ๋ ํ์
- for๋ฌธ ์์์ ์ฌ๊ท ํจ์ ํธ์ถ
- ๋ฐ๋ณต
- ๊ธฐ์ ์กฐ๊ฑด ๋ง๋๋ฉด return
- ์์๋ ธ๋๊ฐ๋ค๊ฐ ๋ถ๋ชจ๋ ธ๋๊ฐ๋ค๊ฐ ๋ฐ๋ณต -> ์ ์ฒด ํ์
DFS ์ค์ต ํด๋ณด์ฆ์ !
import java.util.*;
public class Main {
public static boolean[] visited = new boolean[9];
public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
// DFS ํจ์ ์ ์
public static void dfs(int x) {
// ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[x] = true;
System.out.print(x + " ");
// ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for (int i = 0; i < graph.get(x).size(); i++) {
int y = graph.get(x).get(i);
if (!visited[y]) dfs(y);
}
}
public static void main(String[] args) {
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < 9; i++) {
graph.add(new ArrayList<Integer>());
}
// ๋
ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(1).add(2);
graph.get(1).add(3);
graph.get(1).add(8);
// ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(2).add(1);
graph.get(2).add(7);
// ๋
ธ๋ 3์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(3).add(1);
graph.get(3).add(4);
graph.get(3).add(5);
// ๋
ธ๋ 4์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(4).add(3);
graph.get(4).add(5);
// ๋
ธ๋ 5์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(5).add(3);
graph.get(5).add(4);
// ๋
ธ๋ 6์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(6).add(7);
// ๋
ธ๋ 7์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(7).add(2);
graph.get(7).add(6);
graph.get(7).add(8);
// ๋
ธ๋ 8์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ
graph.get(8).add(1);
graph.get(8).add(7);
dfs(1);
}
}
1 2 7 6 8 3 4 5
๐ ์ฐธ์กฐ
https://devuna.tistory.com/32
https://freedeveloper.tistory.com/273