Notice
Recent Posts
Recent Comments
Link
ยซ   2024/09   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

BUILD_SSO

DFS/BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณธ๋ฌธ

Problem Solving/Algorithm

DFS/BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

sohyeonnn 2023. 3. 8. 17:27

๐Ÿ“ŒDFS, BFS๋ฅผ ์•Œ์•„๋ณด๊ธฐ์ „ ์•Œ์•„์•ผํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๊ฐœ๋…

ํƒ์ƒ‰(search)

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

 

์Šคํƒ(stack)

- FILO(First In Last Out): ๋ฐ•์Šค ์Œ“๊ธฐ

- list๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ(์‚ฝ์ž…: append, ์‚ญ์ œ: pop)

- ์‹œ๊ฐ„๋ณต์žก๋„: O(1)

 

ํ(queue)

- FIFO(First In First Out): ์ž…๊ตฌ๋ž‘ ์ถœ๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋šซ๋ ค์žˆ๋Š” ํ„ฐ๋„

- from collections import deque(์‚ฝ์ž…: append, ์‚ญ์ œ: popleft)

- ์‹œ๊ฐ„๋ณต์žก๋„: O(1)

 

์žฌ๊ท€ํ•จ์ˆ˜(recursive function)
- ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
- python ์—์„œ๋Š” '์ตœ๋Œ€ ์žฌ๊ท€ ๊นŠ์ด ์ œํ•œ'์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋‹ค๋ฅธ ์„ค์ •์ด ์—†๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฉ”์„ธ์ง€์™€ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜๊ฒŒ ๋œ๋‹ค.
- ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œํ’€์ด ๊ฒฝ์šฐ(์ผ๋ถ€๋Ÿฌ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์—๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
- ๋ชจ๋“  ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ปดํ“จํ„ฐ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
=> ์ด๋Ÿฌํ•œ ํŠน์ง•๋•Œ๋ฌธ์— ์Šคํƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ ๊ตฌํ˜„์ƒ ์Šคํƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹ ์— ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
(ex. ๋‹จ์ˆœํžˆ ๋” ์งง๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ์œ„ํ•ด(dfs))


๐Ÿ”ตDFS(Depth First Search)

- ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
- ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ(or ์žฌ๊ท€ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•œ๋‹ค.
=>  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด, ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
       ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
       **์ฆ‰, ๋งค๋ฒˆ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋กœ๋„ ๋ฐฉ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ.
    3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.


- ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋˜๋ฉด ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— list์˜ 0๋ฒˆ index๋Š” ๋น„์šฐ๊ณ  index 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ”ตBFS(Breadth First Search)

- ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
- ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
=>  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ๋‹ค.
       **ํ•ด๋‹น ์‹œ์ ์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ 'ํ•œ๋ฒˆ์—' ๋ชจ๋‘ ํ์— ๋„ฃ๋Š”๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.
    3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

DFS ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ

#์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„
def dfs(graph, v, visit): #visit; ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ
    visit[v] = True     #ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•ด์คŒ
    print(v, end=' ')   #๊ทธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

    #ํ˜„์žฌ ํ™•์ธํ•˜๊ณ  ์žˆ๋Š” = ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visit[i]:        #๋งŒ์•ฝ ๊ทธ ๋…ธ๋“œ๊ฐ€ = ์ฆ‰ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด, 
            dfs(graph, i, visit)    #์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฐฉ๋ฌธ์„ ์ง„ํ–‰ํ•œ๋‹ค

#2์ฐจ์› ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•ด์คŒ
graph = [
    [],     #๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ์˜์ƒ 0๋ฒˆ INDEX๋ฅผ ๋น„์›Œ์คŒ 
    [2, 3, 8],  #์ธ๋ฑ์Šค ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ‘œํ˜„ํ•ด์คŒ; 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ๊ฑด 2, 3, 8 ๋ฒˆ ๋…ธ๋“œ๋ผ๋Š” ๋œป
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

#๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“ ๊ฐ’๋“ค์„ False๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์„œ ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒƒ ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
#index 0์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด 9๋ฅผ ๊ณฑํ•จ
#๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜์˜ 1์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์คŒ
visit = [False] * 9

dfs(graph, 1, visit)

 

BFS ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ

from collections import deque

def bfs(graph, start, visited):

    #์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ์–ด์คŒ.
    queue = deque([start])

    #์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ๋‹ค.
    #๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ž€, ์Šคํƒ์— ํ•œ ๋ฒˆ์ด๋ผ๋„ ์‚ฝ์ž…๋œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๋„๋ก ์ฒดํฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ์œผ๋กœ์จ ๊ฐ ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    visited[start] = True

    #์ดํ›„์— ํ๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ = ๋”์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
    while queue:

        v = queue.popleft()         #ํ์—์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜ ๊บผ๋‚ธ๋‹ค.
        print(v, end=' ')

        for i in graph[v]:          #๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ
            if not visited[i]:      #์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ฒŒ ์žˆ๋‹ค๋ฉด
                queue.append(i)     #ํ์— ๋‹ค ๋„ฃ์–ด์ฃผ๋„๋ก ํ•œ๋‹ค.
                visited[i] = True


#๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„(๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•œ ๋ถ€๋ถ„)
graph = [
    [],         #0๋ฒˆ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ ๋น„์›Œ์ค€๋‹ค.(์‚ฌ์šฉx)
    [2,3,8],    #1๋ฒˆ ๋…ธ๋“œ๊ฐ€ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋…ธ๋“œ๋“ค
    [1,7],      #2๋ฒˆ ๋…ธ๋“œ๊ฐ€ ...
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7],
]

#๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋ชฉ์ ์œผ๋กœ visited ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์คŒ
visited = [False]*9

bfs(graph, 1, visited)

 

 

*์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค 2021 ์œ ํŠœ๋ธŒ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Comments