๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Algorithms & Data Structure

[Algorithm] ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS) ๊ณผ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)

by vodkassi 2021. 6. 30.
728x90

DFS ์™€ BFS ๋Š” ๊ฐ๊ฐ Depth-First Search ์™€ Breadth-First Search ๋กœ, ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰๊ณผ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ๋œปํ•œ๋‹ค. ๋‘˜์˜ ์ฐจ์ด์ ๊ณผ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

BFS & DFS

BFS

  • ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐํ˜•์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 
  • ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ ๋‹จ๊ณ„

  1. ํ์— ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  2. ํ์˜ front ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ , popleft() ๋ฅผ ํ•œ๋‹ค.
  3. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค
  4. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ํ์˜ front ์„ ๊บผ๋‚ธ๋‹ค
  5. ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜์—ฌ ํ๊ฐ€ ์™„์ „ํžˆ ๋นŒ ๋•Œ ์ข…๋ฃŒํ•œ๋‹ค
from collections import deque # Python ์—์„œ popleft() ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ

# ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 
# ๊ฐ€๋ น, 1 - 3 - 2 - 4 ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ผ๋ฉด, [[], [3], [3, 4], [1, 2], [2]] ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
graph = [[], [3], [3, 4], [1, 2], [2]]

# ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ 1์ฐจ์› ๋ฐฐ์—ด
# ์ดˆ๊ธฐ๊ฐ’์„ False ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ node ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด True ๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
visited = [False] * (len(graph))

# ๋ฐฉ๋ฌธํ•ด์•ผํ•  ๋ชฉ๋ก์„ ๋‹ด์€ queue์„ ๋งŒ๋“ค์–ด while ๋ฌธ ์‹คํ–‰
queue = deque([1]) # ์ฒซ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ
while len(queue) > 0 :
	cur = queue.popleft()
    print(cur)
    for item in graph[cur]:
    	if visited[item] == False:
        	queue.append(item)
            visited[cur] = True

    	

DFS

  • ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐํ˜•์—์„œ ๊ฐ€์žฅ ๊นŠ์€ ๋ถ€๋ถ„์„ (์ฆ‰, ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ํ•˜์œ„์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ) ๋จผ์ € ๋ฐฉ๋ฌธํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 
  • ์Šคํƒ ๋˜๋Š” ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ ๋‹จ๊ณ„

  1. ์Šคํƒ์— ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค
  2. ์Šคํƒ์˜ top ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค pop ์œผ๋กœ ์‚ญ์ œํ•˜๊ณ , ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค
  3. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค
  4. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์Šคํƒ์˜ top ์„ ๊บผ๋‚ธ๋‹ค
  5. ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜์—ฌ ์Šคํƒ์ด ์™„์ „ํžˆ ๋นŒ ๋•Œ ์ข…๋ฃŒํ•œ๋‹ค
# ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 
# ๊ฐ€๋ น, 1 - 3 - 2 - 4 ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ผ๋ฉด, [[], [3], [3, 4], [1, 2], [2]] ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.
graph = [[], [3], [3, 4], [1, 2], [2]]

# ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ 1์ฐจ์› ๋ฐฐ์—ด
# ์ดˆ๊ธฐ๊ฐ’์„ False ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ node ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด True ๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
visited = [False] * (len(graph))

# ๋ฐฉ๋ฒ• 1
# ๋ฐฉ๋ฌธํ•ด์•ผํ•  ๋ชฉ๋ก์„ ๋‹ด์€ stack์„ ๋งŒ๋“ค์–ด while ๋ฌธ ์‹คํ–‰
stack = [1] # ์ฒซ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ
while len(stack) > 0 :
	cur = stack.pop()
    print(cur)
    visited[cur] = True
    for item in graph[cur]:
    	if visited[item] == False:
        	stack.append(item)

๋ฐฉ๋ฒ• 2
# ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
dfs(graph, node, visited):
	visited[node] = True
    print(node)
    for item in graph[node]:
    	if not visited[node]:
        	dfs(graph, item, visited)
    for i in graph[node]:
    	

 

 

 

๋Œ“๊ธ€