๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_18_DFS ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with python

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python]_18_DFS

์ง•์ง•์•ŒํŒŒ์นด 2022. 2. 2. 01:03
728x90
๋ฐ˜์‘ํ˜•

220202 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ใ€Ž์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹คใ€ ์˜ youtube๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://www.youtube.com/watch?v=1vLqC1rItM8&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=18 

 

 

 

 

 

 

1. DFS (Depth-First Search)

: ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

: ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰

: ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ ( ์žฌ๊ท€ํ•จ์ˆ˜ ) ์ด์šฉ

 

1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ•จ

2) ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

( ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ ๊บผ๋‚ด๊ธฐ)

3) 2๋ฒˆ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

 

 

+) ๋™์ž‘ ์˜ˆ์‹œ

- ์‹œ์ž‘ ๋…ธ๋“œ 1

: ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘ ๋…ธ๋“œ๋ถ€ํ„ฐ ! ๋ฐฉ๋ฌธ

 

- 2, 3, 8 ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 2๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ !

- 2์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ 7์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ !

- 8, 6 ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 6์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ !

- 6์—์„œ ๋”์ด์ƒ ๊นŠ์–ด์งˆ ๊ณณ์ด ์—†๋‹ค ! 6์„ ๋นผ๋ผ !

- 7 ์—์„œ ์•ˆ ๊ฐ€๋ณธ... 8์„ ๊ฐ€๋ณด์ž !!!

- 8 ์€ 1 ๋ฐ–์— ์—†์ฆ!! 1์€ ์ด๋ฏธ ํ–ˆ์œผ๋ฏ€๋กœ 3์„ ๊ฐ„๋‹น

- 4, 5, ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 4 !

- ๊ทธ๋‹ค์Œ ๋งˆ์ง€๋ง‰ 5 !

 

=> 1, 2, 7, 6, 8, 3, 4, 5

 

  • python
def dfs(graph, v, visited) :
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end = " ")
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์  ๋ฐฉ๋ฌธ
    for i in graph[v] :
        if not visited[i] :
            dfs(graph, i, visited)

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด ํ‘œํ˜„ ( 2์ฐจ์› ๋ฆฌ์ŠคํŠธ )
graph = [
  [],
  [2, 3, 5],
  [1, 7],
  [1, 4, 5],
  [3, 4],
  [3, 5],
  [2, 5, 4],
  [7],
  [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด ํ‘œํ˜„ ( 1์ฐจ์› ๋ฆฌ์ŠคํŠธ )
visited = [False] * 9

dfs(graph, 1, visited)


# result
# 1 2 7 3 4 5
  • c++
#include <bits/stdc++.h>
using namespace std;

bool visited[9];
vector<int> graph[9];

// DFS ํ•จ์ˆ˜ ์ •์˜
void dfs(int x) {
    // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[x] = true;
    cout << x << ' ';
    // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for (int i = 0; i < graph[x].size(); i++) {
        int y = graph[x][i];
        if (!visited[y]) dfs(y);
    }
}

int main(void) {
    // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[1].push_back(8);
    
    // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[2].push_back(1);
    graph[2].push_back(7);
    
    // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[3].push_back(1);
    graph[3].push_back(4);
    graph[3].push_back(5);
    
    // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[4].push_back(3);
    graph[4].push_back(5);
    
    // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[5].push_back(3);
    graph[5].push_back(4);
    
    // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[6].push_back(7);
    
    // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[7].push_back(2);
    graph[7].push_back(6);
    graph[7].push_back(8);
    
    // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
    graph[8].push_back(1);
    graph[8].push_back(7);
    
    dfs(1);
}
  • java
import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // DFS ํ•จ์ˆ˜ ์ •์˜
    public static void dfs(int x) {
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[x] = true;
        System.out.print(x + " ");
        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
        for (int i = 0; i < graph.get(x).size(); i++) {
            int y = graph.get(x).get(i);
            if (!visited[y]) dfs(y);
        }
    }

    public static void main(String[] args) {
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);
        
        // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(2).add(1);
        graph.get(2).add(7);
        
        // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);
        
        // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(4).add(3);
        graph.get(4).add(5);
        
        // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(5).add(3);
        graph.get(5).add(4);
        
        // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(6).add(7);
        
        // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);
        
        // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(8).add(1);
        graph.get(8).add(7);

        dfs(1);
    }

}

 

 

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments