๐ DFS & BFS ์ต์ข ์ ๋ฆฌ
DFS : Depth First Search ๊น์ด ์ฐ์ ํ์
BFS : Breadth First Search ๋๋น ์ฐ์ ํ์
๊ทธ๋ํ๋ฅผ ํ์ํ๊ธฐ ์ํ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ DFS, BFS๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์คํ, ํ, ์ฌ๊ท๋ฅผ ๋จผ์ ์์์ผํ๋ค.
ํ(Queue)
์คํ๊ณผ ๋ฐ๋๋ก FIFO ๊ฐ๋ ์ผ๋ก ๋จผ์ ๋ค์ด๊ฐ ๊ฒ์ด ๋จผ์ ๋๊ฐ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
public class Main{
public static void main(String[] args) {
Queue<Integer> Q = new LinkedList<>();
Q.offer(1);
Q.offer(2);
Q.offer(3);
Q.poll(); // 1 ์ถ๋ ฅ
Q.offer(4);
Q.poll(); // 2 ์ถ๋ ฅ
}
}
์ ์ญ ํด๋์ค Node
DFS์ BFS์์ ์ฌ์ฉํ Node ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ์๋ค. ๋ ธ๋๋ ๊ทธ๋ํ์ ๊ฐ๊ฐ์ ์ง์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Class Node {
int data;
Node lt, rt;
public Node(int val) {
data = val;
lt = null;
rt = null;
}
}
A๋ฒ ๋ ธ๋๋ lt์ ํด๋นํ๋ B๋ฒ ๋ ธ๋, rt์ ํด๋นํ๋ C๋ฒ ๋ ธ๋๊ฐ ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก B๋ฒ ๋ ธ๋์๋ lt์ ํด๋นํ๋ D๋ฒ ๋ ธ๋, rt๋ฒ์ ํด๋นํ๋ E๋ฒ ๋ ธ๋๊ฐ ์๋ค. ์ด๋ฐ ์์ผ๋ก Node ํด๋์ค๋ val(ex: a)์ lt, rt๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์์ ์ด๋ค.
DFS
DFS๋ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ํํ๋ฅผ ์ง๋๋ค. ์์ ๊ทธ๋ฆผ์ฒ๋ผ 0์์ 1๋ก, 1์์ 3์ผ๋ก ๊ฐ์ ๋ ๋ ์ด์ ๊ฐ ๊ณณ์ด ์๋ค๋ฉด ๋ฐฑํธ๋ํนBackTracking)์ ํด์ ๋ค์ 1๋ก ๊ฐ๊ฒ ๋๋ค. ์ดํ์ ๋ฐฉ๋ฌธํ์ง ์์ 4๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ ํํ์ด๋ค.
ํํ ๋ฏธ๋ก๋ฅผ ๋ง์ด ์์๋ ๋ค. ๋ฏธ๋ก๋ฅผ ํ์ํ ๋ ํด๋น ๋ถ๊ธฐ์์ ๊ฐ ์ ์์ ๋๊น์ง ๊ณ์ ๊ฐ๋ค๊ฐ ๋ ์ด์ ๊ฐ ์ ์๊ฒ ๋๋ฉด ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ๋ฆผ๊ธธ๋ก ๋์์์(๋ฐฑํธ๋ํน) ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ค์ ํ์์ ์งํํ๋ ๋ฐฉ์์ด๋ค.
DFS๋ ๋๊ฒ ์คํ์ ์ฌ์ฉํ๊ณ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. BFS๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํ๋์ง๋ง ๊ฒ์์๋ ์์ฒด๋ BFS์ ๋นํด ๋๋ฆฌ๋ค.
์ฝ๋๋ก ๊ตฌํํด๋ณธ๋ค๋ฉด?
public class DFS {
Node root;
public static void main(String[] args){
DFS tree = new DFS();
tree.root = new Node(0);
tree.root.lt = new Node(1);
tree.root.rt = new Node(2);
tree.root.lt.lt = new Node(3);
tree.root.lt.rt = new Node(4);
tree.root.rt.lt = new Node(5);
tree.root.rt.rt = new Node(6);
tree.DFS(tree.root);
}
}
์ฒซ๋ฒ์งธ๋ก ์ ์ฌ์ง ์ฒ๋ผ ํธ๋ฆฌ ํ์์ผ๋ก ๋ ธ๋๋ฅผ ๊ตฌ์ฑํ๋ค. ์ดํ์ DFS()ํจ์๋ฅผ ์คํ์ํจ๋ค. ์ธ์๊ฐ์ผ๋ก tree.root๋ฅผ ๋ฃ์๋๋ฐ ์ฒซ๋ฒ์งธ ๋ ธ๋ ๊ฐ 0 ์ด ๋ค์ด๊ฐ๋ค.
public void DFS(Node root){
if( root == null ) return;
else {
System.out.print(root.data + " ");
DFS(root.lt);
DFS(root.rt);
}
}
// 0 1 3 4 2 5 6
์ ๊ทธ๋ฆผ์ฒ๋ผ ์ผ์ชฝ๋ถํฐ ์์ฐจ์ ์ผ๋ก ๊น์ด ์ฐ์ ํ์์ด ์คํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
์ฒ์์ DFS(tree.root)ํจ์๋ฅผ ํธ์ถ์์ผฐ๋ค. ์ฆ, DFS ์ธ์๊ฐ์ผ๋ก 0์ด ์ฒ์ ๋ค์ด์จ๋ค.
0์ null์ด ์๋๊ธฐ ๋๋ฌธ์ else๋ฌธ์ ํ๊ฒ ๋๊ณ 0์ ์ถ๋ ฅํ ํ์ DFS(root.lt)๋ฅผ ํธ์ถํ๋ค. ์ฆ 0์ ์ผ์ชฝ ๋ ธ๋์ธ 1์ ํธ์ถํ๋ค. ๊ทธ๋ฌ๋ฉด DFS(root.rt)๋ ์คํ์ ์์ด๊ณ DFS(root.lt)๋ฅผ ์คํํ๋ค.
DFS(root.lt)๊ฐ ์คํํ๋ฉด ์ธ์๊ฐ์ผ๋ก 1์ด ๋์ด์จ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก 1์ null์ด ์๋๊ธฐ ๋๋ฌธ์ else๋ฌธ์ ํ๊ฒ ๋๋ค. 1์ ์ถ๋ ฅํ ํ์ DFS(root.lt)๋ฅผ ์คํํ๋ค. ์ด๋ฒ์๋ ๋๊ฐ์ด DFS(root.rt)๋ ์คํ์ ์์ธ๋ค.
DFS(1์ root.lt = 3)์ด ์คํ๋๊ณ ํ์ฌ๊น์ง System.out.print()๋ก ์ฝ์์ ์ถ๋ ฅํ ๊ฒ์ 0 1 3 ์ ๋๋ค. ๊ทธ ๋ค์ ์ํํ ๊ฒ์ 3์ lt์ด๋ค. ํ์ง๋ง tree์ 3์ lt๊ฐ์ ์๋ค. ์ฆ null์ด๊ธฐ ๋๋ฌธ์ return ๋๋ค. ์ด ๋ถ๋ถ์ด ๋ฐ๋ก ๋ฐฑํธ๋ํน์ด๋ค.
๊ทธ๋ฌ๋ฉด 3์์ ๋ฐฑํธ๋ํน์ ํด์ 1๋ก ๋ค์ ๋์ด์ค๊ณ ์คํ์ ์์ธ DFS(1์ root.rt = 4 )๊ฐ ์ํ๋๋ค. ์ด๋ฐ ๋ก์ง์ด ๊ณ์ํด์ ๋ฐ๋ณตํ์ฌ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๋ค.
๐ DFS๋ if~else ์ฌ์ฉ
BFS
BFS๋ ์ฌ๊ท์ ์ผ๋ก ๋์ํ์ง ์๊ณ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ์ฐจ๋ก๋ก ์ ์ฅํ ํ ๊บผ๋ผ ์ ์๋ ํ๋ฅผ ์ฌ์ฉํ๋ค. ์ฆ ์ ์ ์ ์ถ์์น์ผ๋ก ํ์ํ๋ค. ์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์๋ ์ ์ ์ ๋์ค์ ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ ๋๊ฒ ๋ ๋ ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
( tree๋ DFS์ ๋์ผํ๊ฒ ๊ตฌ์ฑํ์์ )
public class BFS {
Node root;
public static void main(String[] args){
BFS tree = new BFS();
tree.root = new Node(0);
tree.root.lt = new Node(1);
tree.root.rt = new Node(2);
tree.root.lt.lt = new Node(3);
tree.root.lt.rt = new Node(4);
tree.root.rt.lt = new Node(5);
tree.root.rt.rt = new Node(6);
tree.BFS(tree.root)
}
}
public void BFS(Node root){
Queue<Node> Q = new LinkedList<>();
Q.offer(root);
int L = 0;
while(!Q.isEmpty()) {
int len = Q.size();
System.out.print(L + " : ");
for(int i=0; i<len; ++i){
Node current = Q.poll();
System.out.print(current.data + " ");
if(current.lt != null) {
Q.offer(current.lt);
}
if(current.rt != null) {
Q.offer(current.rt);
}
}
L++;
System.out.println();
}
}
// 0 : 0
// 1 : 1 2
// 2 : 3 4 5 6
์ ๊ทธ๋ฆผ์ฒ๋ผ ๋์ด ์ฐ์ ํ์์ด ์งํ๋๋ค.
์ฒ์์ DFS์ ๋๊ฐ์ด ์ธ์๊ฐ์ผ๋ก 0์ด ๋ค์ด์จ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ 0์ ๋ฃ๊ฒ๋๋ค. L์ ๋ ๋ฒจ์ ๋ปํ๊ณ ์ด๊ธฐ๊ฐ์ผ๋ก 0์ ์ธํ ํ๋ค.( ๋ ๋ฒจ์ ํธ์์ ๋ฃ์ ๊ฒ)
while๋ฌธ์ Queue๊ฐ ๋น์ด์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค. ํ์ฌ Queue์๋ 0ํ๋๋ง ๋ค์ด๊ฐ์๊ธฐ๋๋ฌธ์ ๊ธธ์ด len์ 1์ด๋ค. ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ Queue์์ ์ฒซ๋ฒ์งธ ๊ฐ์ ๊บผ๋ด์ค๊ณ (0์ด ๊บผ๋ด์ง ๊ฒ), ๊ทธ ๊ฐ์ ์ถ๋ ฅํ ํ์ lt์ rt๊ฐ์ด ์๋ค๋ฉด Queue์ ๋ฃ์ด์ค๋ค.
์ด์ ๋ Queue์ 2๊ฐ์ ๊ฐ(1,2)์ด ๋ค์ด์๋ค. ๋ฐ๋ณต๋ฌธ์ Queue์ ๊ธธ์ด์ธ 2๋งํผ ๋๋ฉด์ ํ๋์ฉ ๊บผ๋ด์ ๊ฐ์ ์ถ๋ ฅํด์ฃผ๊ณ ์ด๋ฒ์๋ lt์ rt ๊ฐ์ด ์๋ค๋ฉด Queue์ ๋ฃ์ด์ค๋ค.
์ฝ๊ฒ ๋งํด 0์ผ ๋ 1,2๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ณ , 1์ผ ๋ 3,4๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ณ , 2์ผ ๋ 5,6์ ํ์ ๋ฃ์ด์ฃผ๋ ํ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ด๊ฐ ์์๋๋ก ๊บผ๋ด์ ธ ๋์ค๋ ๊ฒ์ด๋ค
๐ BFS๋ while๋ฌธ ์ฌ์ฉ
'๐ ์ฝ๋ฉํ ์คํธ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] String.Format() ์๋ฆฟ์ ์ฑ์ฐ๊ธฐ (0) | 2024.03.09 |
---|---|
[JAVA] ์คํํ๋ ์ & ์ฌ๊ทํจ์ (1) | 2024.01.11 |
[JAVA] Comparable & Comparator (0) | 2024.01.09 |
[JAVA][์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ์ ( TreeSet ) (0) | 2023.12.12 |
[JAVA] HashSet (0) | 2023.04.05 |