Skip to content

Latest commit

ย 

History

History
112 lines (80 loc) ยท 2.94 KB

DFS&BFS.md

File metadata and controls

112 lines (80 loc) ยท 2.94 KB

DFS & BFS

๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (DFS, Depth-First Search)

Root Node ํ˜น์€ ๋‹ค๋ฅธ ์ž„์˜์˜ Node์—์„œ ๋‹ค์Œ ๋ถ„๊ธฐ(Branch)๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ•ด๋‹น Branch๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํŠน์ง•

  • Stack ๋˜๋Š” Deque, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๊ฐ€๋‹ค๊ฐ€ ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์—†๊ฒŒ๋˜๋ฉด ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์— ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : O(V + E)
  • ์ธ์ ‘ ํ–‰๋ ฌ : O(V^2)

์ ‘์ (V), ๊ฐ„์„ (E)

Gif๋กœ ์ดํ•ดํ•˜๊ธฐ

Depth-First-Search

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ (BFS, Breadth-First Search)

๋ฃจํŠธ๋…ธ๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ์ž„์˜์˜ ๋…ธ๋“œ์—์„œ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํŠน์ง•

  • Queue ๋˜๋Š” Deque๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค๋Š” ์ฃผ๋กœ ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ ์ด ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : O(V + E)
  • ์ธ์ ‘ ํ–‰๋ ฌ : O(V^2)

์ ‘์ (V), ๊ฐ„์„ (E)

Gif๋กœ ์ดํ•ดํ•˜๊ธฐ

Breadth-First-Search-Algorithm

๐Ÿ“Œ์˜ˆ์ œ (Baekjoon)

๋ฐ”์ด๋Ÿฌ์Šค

๋ฌธ์ œ

image

ํ’€์ด

1๋ฒˆ ์ปดํ“จํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ๋“ค์„ ์ฐพ๋Š” ์—ฐ๊ฒฐ ์š”์†Œ ์ฐพ๊ธฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์„ ์‹ธ์žก์•„ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ ์š”์†Œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. DFS์™€ BFS ๋‘˜ ๋‹ค๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ ๋‹นํ•œ ๋‚œ์ด๋„์˜ ๋ฌธ์ œ๋กœ, ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์—ฐ์Šตํ•˜๊ธฐ ์ข‹์€ ๋ฌธ์ œ ์ž…๋‹ˆ๋‹ค.

  • DFS - ์žฌ๊ท€ํ•จ์ˆ˜
  • BFS - Deque

DFS ์ฝ”๋“œ

read = sys.stdin.readline

def dfs(start, dic):
  visited.append(start)
  for i in dic[start]:
    if i not in visited:
      dfs(i, dic)
  return len(visited) - 1

dic = {}
visited = []

for i in range(int(read())):
  dic[i + 1] = set()

for _ in range(int(read())):
  a, b = map(int, read().split())
  dic[a].add(b)
  dic[b].add(a)

print(dfs(1,dic))

BFS ์ฝ”๋“œ

from collections import deque
import sys
read = sys.stdin.readline

def bfs(start, dic):
  q = deque()
  q.append(start)

  while q:
    start = q.popleft()
    for i in dic[start]:
      if i not in visited:
        visited.append(i)
        q.append(i)

  return len(visited) - 1

dic = {}
visited = []

for i in range(int(read())):
  dic[i + 1] = set()
for _ in range(int(read())):
  a, b = map(int, read().split())
  dic[a].add(b)
  dic[b].add(a)

print(bfs(1, dic))

Reference

https://developer-mac.tistory.com/64