πŸ˜‡ DFS, BFS in Java

YOU KNOW I MEANΒ·2021λ…„ 3μ›” 3일
0

μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ—μ„œ 제일 κΈ°μ΄ˆκ°€ λ˜λŠ” DFS, BFS!!!
ν’€ λ•Œλ§ˆλ‹€ ν—·κ°ˆλ¦¬λŠ” λΆ€λΆ„ 쀑 ν•˜λ‚˜μΈλ°μš”. ν™•μ‹€ν•˜κ²Œ κΈ°μ–΅ν•˜κ³  μ‹Άμ–΄μ„œ μ •λ¦¬ν•΄λ΄…λ‹ˆλ‹€. πŸ₯²

λ¨Όμ €, μ•„λž˜μ˜ κ°•μ˜λ₯Ό μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€. μœ νŠœλΈŒμ—μ„œ DFS, BFS in Java 라고 치면 제일 λ¨Όμ € λ‚˜μ˜€λŠ” κ°•μ˜μž…λ‹ˆλ‹€.

πŸ”— Graph DFS, BFS in Java


DFSλŠ” μžμ‹ κ³Ό μ—°κ²°λœ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. ν›„μž… μ„ μΆœ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. λ―Έν‘ν•œ κ·Έλ¦Ό μ‹€λ ₯으둜 DFSλ₯Ό νŠΈλ¦¬ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚΄λ³Έλ‹€λ©΄!

μ΄λŸ¬ν•œ μˆœμ„œλ‘œ 방문을 ν•©λ‹ˆλ‹€.

  • 제일 μƒμœ„μ˜ λ…Έλ“œλ₯Ό 1번으둜 κ°€μ •ν–ˆμ„ λ•Œ μžμ‹ λ…Έλ“œλΆ€ν„° 방문을 ν•©λ‹ˆλ‹€.
  • λ°©λ¬Έν•œ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ₯Ό λ°©λ¬Έν•©λ‹ˆλ‹€.
    • 1λ²ˆμ„ stack에 λ„£μŠ΅λ‹ˆλ‹€.
    • 1λ²ˆμ„ 뽑아 좜λ ₯ν•©λ‹ˆλ‹€.
    • 1번과 μ—°κ²°λœ 4, 3, 2λ₯Ό μˆœμ„œλŒ€λ‘œ λ„£μŠ΅λ‹ˆλ‹€.
    • stack에 μžˆλŠ” 2λ²ˆμ„ 뽑아 좜λ ₯ν•©λ‹ˆλ‹€.
    • 2번과 μ—°κ²°λœ 6, 5λ₯Ό μˆœμ„œλŒ€λ‘œ λ„£μŠ΅λ‹ˆλ‹€.
    • stack에 λ„£κ³  뽑고 좜λ ₯ν•˜λŠ” μž‘μ—…μ„ λ°˜λ³΅ν•©λ‹ˆλ‹€.
  • recursion(μž¬κ·€) 톡해 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ κ΅¬ν˜„ (in Java)

   public static void dfs(int node, boolean[] visited, StringBuilder sb) {
        if(visited[node]) return;
        
        visited[node] = true;
        sb.append(node + " ");
        for(int nextNode:nodeList[node]) {
            dfs(nextNode, visited, sb);
        }
    }


BFSλŠ” ν˜•μ œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. μ„ μž…μ„ μΆœ 방식인 queue둜 κ΅¬ν˜„ν•©λ‹ˆλ‹€. BFSλ₯Ό νŠΈλ¦¬ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚΄λ³Έλ‹€λ©΄!

μ΄λŸ¬ν•œ μˆœμ„œλ‘œ 방문을 ν•©λ‹ˆλ‹€.

  • 제일 μƒμœ„μ˜ λ…Έλ“œλ₯Ό 1번으둜 κ°€μ •ν–ˆμ„ λ•Œ ν˜•μ œ λ…Έλ“œλΆ€ν„° λ°©λ¬Έ ν•©λ‹ˆλ‹€.
    • 1λ²ˆμ„ queue에 λ„£μŠ΅λ‹ˆλ‹€.
    • 1λ²ˆμ„ 뽑아 좜λ ₯ν•©λ‹ˆλ‹€.
    • 1번과 μ—°κ²°λœ 2, 3, 4λ₯Ό μˆœμ„œλŒ€λ‘œ λ„£μŠ΅λ‹ˆλ‹€.
    • queue에 μžˆλŠ” 2λ²ˆμ„ 뽑아 좜λ ₯ν•©λ‹ˆλ‹€.
    • 2번과 μ—°κ²°λœ 5, 6λ₯Ό μˆœμ„œλŒ€λ‘œ λ„£μŠ΅λ‹ˆλ‹€.
    • μ„ μž…μ„ μΆœμ΄κΈ° λ•Œλ¬Έμ— 3λ²ˆμ„ 뽑아 좜λ ₯ν•©λ‹ˆλ‹€.
    • 3번과 μ—°κ²°λœ 7, 8을 λ„£μŠ΅λ‹ˆλ‹€.
    • 4λ²ˆμ„ 뽑아 좜λ ₯ν•˜κ³  μ—°κ²°λœ 9, 10을 λ„£μŠ΅λ‹ˆλ‹€.
    • queueκ°€ 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.

μ½”λ“œ κ΅¬ν˜„ (in Java)

public static void bfs(int node, boolean[] visited, StringBuilder sb) {
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(node);
        
        while(!queue.isEmpty()) {
            node = queue.poll();
            
            if(visited[node]) continue;
            
            visited[node] = true;
            sb.append(node + " ");
            
            for(int nextNode:nodeList[node]) {
                queue.add(nextNode);
            }
        }
    }



πŸ’‘ 정리 ν›„ λŠλ‚€μ 

  • κ·Έλž˜ν”„μ™€ νŠΈλ¦¬μ— λŒ€ν•œ 이해가 ν•„μš”ν•¨μ„ 느껴 μ‘°λ§Œκ°„ 정리할 μ˜ˆμ •μž…λ‹ˆλ‹€.

1개의 λŒ“κΈ€

comment-user-thumbnail
2021λ…„ 4μ›” 29일

이해가 ν•œλ°©μ— λ˜λ„€μš” 🍻

λ‹΅κΈ€ 달기