๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CodingTest

[Python] DFS & BFS

by ๋„์บ๋ฆฌ๐Ÿฑ 2021. 5. 12.
๋ฐ˜์‘ํ˜•
๊ทธ๋ž˜ํ”„๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์ถฉ๋ถ„ํ•œ ์„ค๋ช…์ด ์žˆ๋Š” ๊ธ€์€ ์•„๋‹™๋‹ˆ๋‹ค.
python ์œผ๋กœ DFS , BFS ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์™€ ๊ทธ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜ํ”„๋ž€?

- ์‚ฌ์šฉ

    ์ง€๋„, ๋„ค์ด๊ฒŒ์ด์…˜์— ์“ฐ์ž„

    SNS, ๋ฉ”์‹ ์ €(ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ)

    ๊นƒ VCS ์— ์“ฐ์ž„

 

- ์ •์ (vertext == node) ๊ณผ ๊ฐ„์„ (edge)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ.

 

- ๊ตฌ๋ถ„

    1. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(==์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„)

    2. ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„

    --------------------------------

    1. ์ˆœํ™˜ ๊ทธ๋ž˜ํ”„

    2. ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„

 

    ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„(DAG) Directed Acyclic Graph

 

- ์—ฐ๊ฒฐ์š”์†Œ

์—ฐ๊ฒฐ ์š”์†Œ 2๊ฐœ

 

ํŠธ๋ฆฌ๋ž€?

- ์ˆœํ™˜์„ฑX, ๋ฌด๋ฐฉํ–ฅ

- ๋ฃจํŠธ ๋…ธ๋“œ, ๋ฆฌํ”„ ๋…ธ๋“œ

- ๋…ธ๋“œ A์—์„œ ๋…ธ๋“œ B๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•˜๋ฉฐ ์œ ์ผํ•˜๋‹ค.

 

 

๊ทธ๋ž˜ํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋กœ?

1) ์ธ์ ‘ ํ–‰๋ ฌ๋กœ 

  0 1 2 3
0 0 1 1 1
1 0 0 1 0
2 0 0 0 0
3 0 0 1 0

2) ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ

0 | →1→2→3

1  | →2

2 |

3 | →2 

 

๋ฉ”๋ชจ๋ฆฌ: ์ธ์ ‘ํ–‰๋ ฌ๋ณด๋‹ค ์ธ์ ‘๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์šฐ์ˆ˜

์‹œ๊ฐ„: ์ธ์ ‘ ํ–‰๋ ฌ์ด ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋” ์šฐ์ˆ˜ 

 

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

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

    ์Šคํƒ ๋˜๋Š” ์žฌ๊ท€(์žฌ๊ท€๋„ ์Šคํƒ์ž„) ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„

    BackTracking (ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ์ฒดํฌ ํ•˜๋‹ค๊ฐ€, ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ฆ‰์‹œ ๋’ค๋กœ ๋Œ์•„๊ฐ€๋Š”(์ด ํ›„๋ณด๊ตฐ์„     ์ฒดํฌ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ํ‘œ๊ธฐ ํ›„/ ๊ฐ ํ›„๋ณด๊ตฐ๋“ค์€ DFS๋กœ ํ™•์ธํ•œ๋‹ค.)

 

  • ์ผ๋ฐ˜์ ์ธ DFS ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ๋…ธ๋“œ ์ˆ˜: V
    • ๊ฐ„์„  ์ˆ˜: E
      • ์œ„ ์ฝ”๋“œ์—์„œ while need_visit ์€ V + E ๋ฒˆ ๋งŒํผ ์ˆ˜ํ–‰ํ•จ
    • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
def dfs(graph, start_node):
    visited, need_visit = list(), list()
    need_visit.append(start_node)
    
    while need_visit:
        node = need_visit.pop()
        if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
    
    return visited

 

2) BFS: ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

    ํ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

  • ์ผ๋ฐ˜์ ์ธ BFS ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ๋…ธ๋“œ ์ˆ˜: V
    • ๊ฐ„์„  ์ˆ˜: E
      • ์œ„ ์ฝ”๋“œ์—์„œ while need_visit ์€ V + E ๋ฒˆ ๋งŒํผ ์ˆ˜ํ–‰ํ•จ
    • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
def bfs(graph, start_node):
    visited = list()
    need_visit = list()
    
    need_visit.append(start_node)
    
    while need_visit:
        node = need_visit.pop(0)
        if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
    
    return visited
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€