Deep_Dev
article thumbnail

 

 

๐Ÿ“š 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๋ฌธ ์‚ฌ์šฉ