Skip to content

Latest commit

Β 

History

History
139 lines (104 loc) Β· 5.13 KB

DepthFirstSearch.md

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