[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„

Posted by Euisuk's Dev Log on October 24, 2021

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„

์›๋ณธ ๊ฒŒ์‹œ๊ธ€: https://velog.io/@euisuk-chung/์•Œ๊ณ ๋ฆฌ์ฆ˜-๊ทธ๋ž˜ํ”„

์˜ค๋Š˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ‰์†Œ ๋‘๋ ค์›€์— ๋–จ๋ฉฐ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉฐ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•œ ๊ธ€์ด๋ฏ€๋กœ ๋ฐ˜๋ง์ด์–ด๋„ ์–‘ํ•ด๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„

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

  • ๊ทธ๋ž˜ํ”„๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜ํ™”๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ž˜ ํ‘œํ˜„ํ•จ.

๊ทธ๋ž˜ํ”„ ์ด๋ก 

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์—ฐ๊ตฌํ•˜๋Š” ํ•™๋ฌธ ๋ถ„์•ผ๋ฅผ ๊ทธ๋ž˜ํ”„ ์ด๋ก ์ด๋ผ๊ณ  ํ•จ.
  • ๊ทธ๋ž˜ํ”„๋Š” ์ˆ˜ํ•™์ž ์˜ค์ผ๋Ÿฌ์— ์˜ํ•ด ์ฒ˜์Œ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ๋ชจ๋“  ๋‹ค๋ฆฌ๋ฅผ ํ•œ๋ฒˆ๋งŒ ๊ฑด๋„ˆ์„œ ์ถœ๋ฐœํ–ˆ๋˜ ์žฅ์†Œ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€?๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋‹ต์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊ทธ๋ž˜ํ”„ ์ด๋ก ์„ ํ†ตํ•ด ์ฆ๋ช…ํ•จ.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋Š” ์•„๋ž˜ ๋‘๊ฐ€์ง€(์ •์ , ๊ฐ„์„ )์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋จ
    • ํ‘œ๊ธฐ : G=(V,E)G = (V, E)G=(V,E)
    • ์ •์ (Node) : ์œ„์น˜(๊ฐ์ฒด) V(G)V(G)V(G)
    • ๊ฐ„์„ (Edge) : ์œ„์น˜(๊ฐ์ฒด) ๊ฐ„์˜ ๊ด€๊ณ„ E(G)E(G)E(G)

๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜

๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜

  1. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (undirected graph)

    • ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ทธ๋ž˜ํ”„
  2. ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ (directed graph)

    • ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์„ฑ์ด ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„
  3. ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„ (weighted graph)

    • ๊ฐ„์„ ์— ๋น„์šฉ์ด๋‚˜ ๊ฐ€์ค‘์น˜๊ฐ€ ํ• ๋‹น๋œ ๊ทธ๋ž˜ํ”„
  4. ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„ (subgraph)

    • ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ •์ ์˜ ์ง‘ํ•ฉ๊ณผ ๊ฐ„์„ ์˜ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ž˜ํ”„

๊ทธ๋ž˜ํ”„ ์šฉ์–ด ์ •๋ฆฌ

  1. ์ •์ ์˜ ์ฐจ์ˆ˜ (degree)
    • ์ •์ ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์˜ ์ˆ˜
  2. ์ธ์ ‘ ์ •์  (adjacent vertex)
    • ๊ฐ„์„ ์— ์˜ํ•ด ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ์ •์ 
  3. ๊ฒฝ๋กœ (path)
    • ๊ฐ„์„ ์„ ๋”ฐ๋ผ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ, ํ•œ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋‹ค๋ฅธ ํ•œ ์ •์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ
  4. ๋‹จ์ˆœ ๊ฒฝ๋กœ (simple path)
    • ๊ฒฝ๋กœ ์ค‘์— ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ„์„ ์ด ์—†๋Š” ๊ฒฝ๋กœ
  5. ์‹ธ์ดํด (cycle)
    • ๋‹จ์ˆœ ๊ฒฝ๋กœ์˜ ์‹œ์ž‘ ์ •์ ๊ณผ ์ข…๋ฃŒ ์ •์ ์ด ๋™์ผํ•˜์—ฌ ํ•ด๋‹น ์ •์ ์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ๋กœ
  6. ํŠธ๋ฆฌ (tree)
    • ์‚ฌ์ดํด์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„
  7. ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„ (connected graph)
    • ๋ชจ๋“  ์ •์ ๋“ค ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„
  8. ์™„์ „ ๊ทธ๋ž˜ํ”„ (complete graph)
    • ๋ชจ๋“  ์ •์ ๊ฐ„์— ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„
  9. ๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„

์ธ์ ‘ํ–‰๋ ฌ์„ ์ด์šฉํ•œ ํ‘œํ˜„

  • ๊ทธ๋ž˜ํ”„์—์„œ ์ •์ ๋“ค์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ,์ธ์ ‘ํ–‰๋ ฌ(Adjacency matrix)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•จ
  • ์ธ์ ‘ ํ–‰๋ ฌ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•๋“ค์ด ์กด์žฌํ•œ๋‹ค.

    • ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ธ๋ฑ์Šค

    • ๊ฐ„์„ ์˜ ์กด์žฌ์œ ๋ฌด(๋˜๋Š” ๊ฐ€์ค‘์น˜)๊ฐ€ ์ธ๋ฑ์Šค์˜ ๊ฐ’

    • ๊ฐ„์„ ์ด ์—†๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์œ ์ง€๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์ข‹์ง€ ์•Š์Œ

์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ‘œํ˜„

  • ๊ทธ๋ž˜ํ”„์˜ ๊ฐ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ธ์ ‘ ์ •์ ‘๋“ค์„ ๊ฐ๊ฐ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ(Adjacency list)๋ผ๊ณ  ํ•จ
  • ๊ฐ ์ •์ ์€ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์ž์‹ ๊ณผ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ธ์ ‘ ์ •์ ๋“ค์„ ๊ด€๋ฆฌํ•จ
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•๋“ค์ด ์กด์žฌํ•œ๋‹ค.

    • ํŒŒ์ด์ฌ์—์„œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•จ

    • ์—ฐ๊ฒฐ๋œ ์ •์ ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์ธ์ ‘ ํ–‰๋ ฌ์— ๋น„ํ•ด์„œ ์ข‹์Œ

    • ๊ฐ€์ค‘์น˜ ์ •๋ณด๋Š” ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š์Œ

  1. ๊ทธ๋ž˜ํ”„์˜ ํƒ์ƒ‰

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ์œผ๋กœ ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ์ •์ ๋“ค์„ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•จ
  • ์‹ค์ œ๋กœ ๋งŽ์€ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค์ด ๋‹จ์ˆœํžˆ ์ •์ ๋“ค์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋จ

    • Ex) ๋ฏธ๋กœ ์ฐพ๊ธฐ ๋“ฑ
  • ๊ธฐ๋ณธ์ ์ธ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ๊ณผ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์˜ ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•จ

๐ŸŽ ์—ฌ๊ธฐ์„œ ์ž ๊น!

ํŒŒ์ด์ฌ์€ collections๋ผ๋Š” ๋ชจ๋“ˆ์—์„œ defaultdict, Counter, deque ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด์ค‘ deque์™€ defaultdict๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๊ฒŒ ๊ฐ๊ฐ BFS์™€ DFS๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค!

  • deque : ์–‘์ชฝ ๋์—์„œ ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅ˜ ์ปจํ…Œ์ด๋„ˆ
  • Counter : ํ•ด์‹œ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ์„ธ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์„œ๋ธŒ ํด๋ž˜์Šค
  • OrderedDict : ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์„œ๋ธŒ ํด๋ž˜์Šค
  • defaultdict : ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์„œ๋ธŒ ํด๋ž˜์Šค
1
2
3
4
5
6
7
8
from collections import deque
from collections import defaultdict

# defaultdict๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
a = defaultdict(list) # listํ˜•์‹์œผ๋กœ ์ €์žฅํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋œป

# ํ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
q = deque()

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

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (depth first search, DFS)์€ ์Šคํƒ ๋˜๋Š” ์žฌ๊ท€์„ ์ด์šฉํ•œ ๋ฏธ๋กœ ํƒ์ƒ‰๊ณผ ์œ ์‚ฌํ•จ
  • ๋ฏธ๋กœ๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ๊นŒ์ง€ ๊ณ„์† ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€, ๋” ์ด์ƒ ์ง„ํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค์‹œ ๊ฐ€๊นŒ์šด ๊ฐˆ๋ฆผ๊ธธ๋กœ ๋Œ์•„์™€ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • DFS ๊ณผ์ • (์ถœ์ฒ˜ : https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html)

    DFS ๊ณผ์ •

์ฐธ๊ณ 

  • v : ์‹œ์ž‘ ๋…ธ๋“œ
  • n : ๋…ธ๋“œ(node)์˜ ๊ฐœ์ˆ˜
  • m : ๊ฐ„์„ (edge)์˜ ๊ฐœ์ˆ˜
  • arr : ์ธ์ ‘ํ–‰๋ ฌ
  • a : ์ธ์ ‘๋ฆฌ์ŠคํŠธ

์ธ์ ‘ํ–‰๋ ฌ๊ณผ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ์ด์ „ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ
check = [False] * (n+1)

# DFS ํ•จ์ˆ˜ ์ •์˜
def dfs(v):
  check[v] = True # v๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•จ

  # ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ „๋ถ€ ์ˆœํšŒ
  for i in range(1, n+1):
    # i ์กฐ๊ฑด : v์™€ ์ธ์ ‘ํ•ด์•ผํ•จ + ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์–ด์•ผ ํ•จ
    if arr[v][i] == 1 and check[i] == False:
      dfs(i)

# ํ•จ์ˆ˜ ์‹คํ–‰
dfs(v)

์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ์ด์ „์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ์—ˆ๋Š”์ง€ ์ฒดํฌ
check = [False] * (n+1)

# DFS ํ•จ์ˆ˜ ์ •์˜
def dfs(v):
  check[v] = True # v๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•จ

  # ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ „๋ถ€ ์ˆœํšŒ
  for i in a[v]:
    # ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ์ ‘ํ•œ ์ •์ ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๋“ค์–ด์žˆ๋‹ค.
    # ๋”ฐ๋ผ์„œ, ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์—ˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.
    if check[i] == False:
      dfs(i)

# ํ•จ์ˆ˜ ์‹คํ–‰
dfs(v)

์ธ์ ‘ํ–‰๋ ฌ๊ณผ ์Šคํƒ์„ ์ด์šฉํ•œ DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ์ด์ „ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ
check = [False] * (n+1)

stack = deque()  

def dfs(start):
  check[start] = True
  stack.append(start)
  
  # ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ข…๋ฃŒ
  while stack:
    v = stack.pop()
    print(v)
    for i in range(n, -1, -1):
      if arr[v][i] == 1 and check[i] == False:
        check[i] = True
        stack.append(i)

dfs(v)

์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ์Šคํƒ์„ ์ด์šฉํ•œ DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ์ด์ „์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ์—ˆ๋Š”์ง€ ์ฒดํฌ
check = [False] * (n+1)

stack = deque()  

def dfs(start):
  check[start] = True
  stack.append(start)
  
  # ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ข…๋ฃŒ
  while stack:
    v = stack.pop()
    print(v)
    for i in a[v]:
      if check[i] == False:
        check[i] = True
        stack.append(i)

dfs(v)

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

  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ (breadth first search, BFS)์€ ์‹œ์ž‘ ์ •์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๊ณ , ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ์ •์ ์—๋Š” ๋‚˜์ค‘์— ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•
  • ๋„ˆ๋น„ ์šด์„  ํƒ์ƒ‰์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ •์ ๋“ค์„ ์ฐจ๋ก€๋กœ ์ €์žฅํ•˜๊ณ , ๋“ค์–ด๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ๋ฐ ์ด๋ฅผ ์œ„ํ•ด ํ(Queue)๋ฅผ ์‚ฌ์šฉํ•จ.
  • ํ๋ฅผ ์ด์šฉํ•ด์„œ ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š” ๋ฐฉ์‹ (ํ์— ๋“ค์–ด๊ฐ€๋ฉด, ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•จ)
  • ๋‹ค์‹œ๋งํ•ด, ์ •์ ๋“ค์ด ๋ฐฉ๋ฌธ๋  ๋•Œ๋งˆ๋‹ค ํ์— ์ธ์ ‘ ์ •์ ์„ ์‚ฝ์ž…ํ•˜๊ณ , ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ์ธ์ ‘ ์ •์ ์ด ์—†๋Š” ๊ฒฝ์šฐ ํ์˜ ๋งจ ์•ž์˜ ์ •์ ์„ ๊บผ๋‚ด ๊ทธ ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฉ๋ฌธํ•จ
  • BFS ๊ณผ์ • (์ถœ์ฒ˜ : https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html)

    BFS ๊ณผ์ •

์ฐธ๊ณ 

  • start : ์‹œ์ž‘ ๋…ธ๋“œ
  • n : ๋…ธ๋“œ(node)์˜ ๊ฐœ์ˆ˜
  • m : ๊ฐ„์„ (edge)์˜ ๊ฐœ์ˆ˜
  • arr : ์ธ์ ‘ํ–‰๋ ฌ
  • a : ์ธ์ ‘๋ฆฌ์ŠคํŠธ

์ธ์ ‘ํ–‰๋ ฌ๊ณผ ํ๋ฅผ ์ด์šฉํ•œ BFS

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
# ์ด์ „์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ์—ˆ๋Š”์ง€ ์ฒดํฌ
check = [False] * (n+1)

# ํ ์„ ์–ธ
q = deque()

# BFS์ •์˜
def bfs(v):
  # ๋ฐฉ๋ฌธ ์ฒดํฌ
  check[v] = True
  # ํ์— ์ถ”๊ฐ€
  q.append(v)
  
  # ํ์— ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ข…๋ฃŒ
  while q:
    # FIFO
    pop = q.popleft()
    # ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ „๋ถ€ ์ˆœํšŒ
    for i in range(1, n+1):
      # i ์กฐ๊ฑด : pop๊ณผ ์ธ์ ‘ํ•ด์•ผํ•จ + ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์–ด์•ผ ํ•จ
      if arr[pop][i] == 1 and check[i] == False:
        check[i] = True
        q.append(i)

# ํ•จ์ˆ˜ ์‹คํ–‰
bfs(v)

์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ํ๋ฅผ ์ด์šฉํ•œ BFS

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
# ์ด์ „์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ์—ˆ๋Š”์ง€ ์ฒดํฌ
check = [False] * (n+1)

# ํ ์„ ์–ธ
q = deque()

# BFS์ •์˜
def bfs(v):
  # ๋ฐฉ๋ฌธ ์ฒดํฌ
  check[v] = True
  # ํ์— ์ถ”๊ฐ€
  q.append(v)
  
  # ํ์— ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ข…๋ฃŒ
  while q:
    # FIFO
    pop = q.popleft()
    # ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์ธ์ ‘ํ•œ ์ •์ ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๋“ค์–ด์žˆ๋‹ค.
    # ๋”ฐ๋ผ์„œ, ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์—ˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.
	for i in a[v]:
      if check[i] == False:
        check[i] = True
        q.append(i)

# ํ•จ์ˆ˜ ์‹คํ–‰
bfs(v)

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ^~^



-->