Skip to content

Latest commit

ย 

History

History
139 lines (104 loc) ยท 5.13 KB

File metadata and controls

139 lines (104 loc) ยท 5.13 KB

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(Depth First Search : BFS)

written by sohyeon, hyemin ๐Ÿ’ก


1. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)์ด๋ž€?

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(Depth First Search)์€ ๋ฃจํŠธ ๋…ธ๋“œ(ํ˜น์€ ๋‹ค๋ฅธ ์ž„์˜์˜ ๋…ธ๋“œ)์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋‹ค์Œ ๋ถ„๊ธฐ(branch)๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ•ด๋‹น ๋ถ„๊ธฐ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ๋ฏธ๋กœ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๊ฐ€๋‹ค๊ฐ€ ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฉด ๋‹ค์‹œ ๊ฐ€๊นŒ์šด ๊ฐˆ๋ฆผ๊ธธ๋กœ ๋Œ์•„์™€์„œ ์ด๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

  • ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ ์ž ํ•  ๋•Œ ๋” ์„ ํ˜ธ๋˜๋Š” ํŽธ์ด๋‹ค.

2. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)์˜ ํŠน์ง•

  • ์ „์œ„ ์ˆœํšŒ๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ ์ˆœํšŒ๋Š” ๋ชจ๋‘ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

    • ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค.
  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ์ˆœํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.


3. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)์˜ ๊ณผ์ •

1. ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋จผ์ € ์‹œ์ž‘ ๋…ธ๋“œ v๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฐฉ๋ฌธํ•˜์˜€๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.
2. v์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ u๋ฅผ ์„ ํƒํ•œ๋‹ค.
3. ๋งŒ์•ฝ ๊ทธ๋Ÿฌํ•œ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ํƒ์ƒ‰์€ ์ข…๋ฃŒํ•œ๋‹ค.
4. ๋งŒ์•ฝ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ u๊ฐ€ ์žˆ๋‹ค๋ฉด u๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜์—ฌ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.
5. ์ด ํƒ์ƒ‰์ด ๋๋‚˜๊ฒŒ ๋˜๋ฉด ๋‹ค์‹œ v์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ์•„์ง ๋ฐฉ๋ฌธ์ด ์•ˆ ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.
6. ์—†์„ ๊ฒฝ์šฐ ์ข…๋ฃŒํ•˜๊ณ , ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ ๊ทธ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜์—ฌ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค. 

  • 0๋ฒˆ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ์„ ํƒํ•˜๊ณ  ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜์˜€๋‹ค.

  • ์ ์„  ํ™”์‚ดํ‘œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋กœ์˜ ๋ฐฉ๋ฌธ์„ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ•œ ๊ฐ„์„ ์„ ์˜๋ฏธํ•˜๊ณ , ์‹ค์„  ํ™”์‚ดํ‘œ๋Š” ์‹ค์ œ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฐ„์„ ์„ ์˜๋ฏธํ•œ๋‹ค.


4. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)์˜ ๊ตฌํ˜„

๊ตฌํ˜„ ๋ฐฉ๋ฒ•์—๋Š” ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋ช…์‹œ์ ์ธ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ(๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์„ ์Šคํƒ์— ์ €์žฅํ•˜์˜€๋‹ค๊ฐ€ ๋‹ค์‹œ ๊บผ๋‚ด์–ด ์ž‘์—…ํ•˜๋Š” ๊ฒƒ)์ด๋‹ค.

ex) ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•œ DFS๋ฅผ ๊ตฌํ˜„ํ•œ ์˜์‚ฌ์ฝ”๋“œ(pseudocode)

void search(Node root) {
    if (root == null) return;    
    // root ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.
    visit(root);
    root.visited = true; 
    // root ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ์ •์ ์„ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•œ๋‹ค.
    for each (Node n in root.adjacent) {
        // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด root ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ์ •์  ์ •์ ์„ ์‹œ์ž‘ ์ •์ ์œผ๋กœ DFS๋ฅผ ์‹œ์ž‘
        if (n.visited == false) {
            search(n); 
        }
    }
}
https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html

ex) ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•œ DFS ๊ตฌํ˜„

import java.io.*; 
import java.util.*; 

// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๋ฐฉํ–ฅ์„ฑ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„ ํด๋ž˜์Šค 
class Graph { 
    private int V; // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
    private LinkedList<Integer> adj[]; // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

    // Constructor(์ƒ์„ฑ์ž)
    Graph(int v) { 
        V = v; 
        adj = new LinkedList[v]; 
        for (int i=0; i<v; ++i) 
            adj[i] = new LinkedList(); 
    } 

    // ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. (v->w)
    void addEdge(int v, int w) { 
        adj[v].add(w); // Add w to v's list. 
    } 

    // DFS์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜
    void DFSUtil(int v,boolean visited[]) { 
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ฐ’ ์ถœ๋ ฅํ•œ๋‹ค.
        visited[v] = true; 
        System.out.print(v+" "); 

        // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
        Iterator<Integer> i = adj[v].listIterator(); 
        while (i.hasNext()) { 
            int n = i.next(); 
            
            // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜๊ณ  DFSUtil์„ ํ˜ธ์ถœํ•œ๋‹ค.
            if (!visited[n]) 
                DFSUtil(n, visited); 
            } 
    } 

    // ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ DFS๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    void DFS(int v) { 
        // ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.
        boolean visited[] = new boolean[V]; 

        // v๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜์—ฌ DFSUtil์„ ์ˆœํ™˜ ํ˜ธ์ถœํ•œ๋‹ค.
        DFSUtil(v, visited); 
    } 


    // 2๋ฅผ ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ํ•˜์—ฌ DFS๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    public static void main(String args[]) { 
        Graph g = new Graph(4); 

        g.addEdge(0, 1); 
        g.addEdge(0, 2); 
        g.addEdge(1, 2); 
        g.addEdge(2, 0); 
        g.addEdge(2, 3); 
        g.addEdge(3, 3); 
        
        g.DFS(2); 
    } 
} 


Reference & Additional Resources