์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋‚ด์šฉ ์ •๋ฆฌ (1)
์ฝ”๋”ฉํ…Œ์ŠคํŠธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋‚ด์šฉ ์ •๋ฆฌ (1)

๊ทธ๋ฆฌ๋”” ; ํ˜„์žฌ ๊ฐ€์žฅ ์ข‹์•„ ๋ณด์ด๋Š” ๊ฒƒ๋งŒ์„ ์„ ํƒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜


- ํ˜„์žฌ ์ƒํ™ฉ์—์„œ ์ง€๊ธˆ ๋‹น์žฅ ์ข‹์€ ๊ฒƒ๋งŒ ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•

- ๋งค ์ˆœ๊ฐ„ ๊ฐ€์žฅ ์ข‹์•„๋ณด์ด๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜๋ฉฐ, ํ˜„์žฌ์˜ ์„ ํƒ์ด ๋‚˜์ค‘์— ๋ฏธ์น  ์˜ํ–ฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ

- ๋ฌธ์ œ์—์„œ '๊ฐ€์žฅ ํฐ ์ˆœ์„œ๋Œ€๋กœ','๊ฐ€์žฅ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ' ๋“ฑ๋“ฑ ํ‘œํ˜„์ด ๋‚˜์˜ค๋ฉด ๊ทธ๋ฆฌ๋””๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๊ธฐ

- ๊ทธ๋ฆฌ๋””์™€ ์ •๋ ฌ๋ฌธ์ œ๋Š” ์ง์„ ์ด๋ค„ ์ถœ์ œ๋˜๊ธฐ๋„ ํ•จ

 

๊ตฌํ˜„ ; ๋จธ๋ฆฟ์†์— ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •ํ™•ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ


- ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•ด์„œ ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•์—์„œ๋Š” dx, dy๋ผ๋Š” ๋ณ„๋„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฉํ–ฅ์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ 

ex) dx=[-1,0,1,0]  dy=[0,-1,0,1]

 

 

DFS/BFS ; ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•


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

- ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ์Šคํƒ์‚ฌ์šฉ (ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ)

(1) ํƒ์ƒ‰ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

(2) ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ 

      ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธํŠธ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค(3) (2)๋ฒˆ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.tip) ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

 

DFS ์˜ˆ์ œ์ฝ”๋“œ

DFS/BFS ์˜ˆ์ œ ๊ทธ๋ž˜ํ”„

# DFS
def dfs(graph, v, visited):
    visited[v] = True  # ํ˜„์žฌ๋…ธ๋“œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    print(v, end=' ')
    # ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for node in graph[v]:
        if not visited[node]:  # ๋ฐฉ๋ฌธ ์•ˆํ–ˆ์œผ๋ฉด
            dfs(graph, node, visited)

graph = [
    [],
    [2, 3, 4],  # 1๋ฒˆ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
    [5, 6],
    [1],
    [1, 7],
    [2],
    [2],
    [4]
]

visited = [False] * 8
# ํ•จ์ˆ˜ ํ˜ธ์ถœ
dfs(graph, 1, visited)

# ์ถœ๋ ฅ๊ฒฐ๊ณผ
1 2 5 6 3 4 7

 

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

- ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

- ํ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์šฉ (ํŒŒ์ด์ฌ์—์„œ๋Š” deque ์‚ฌ์šฉ)

- ๋ฌธ์ œ์—์„œ ๋ชจ๋“  ๊ฐ„์„ ์˜ ๋น„์šฉ์ด 1, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ๋™์ผํ•˜๋‹ค๋Š” ์กฐ๊ฑด์ด ๋‚˜์˜จ ๊ฒฝ์šฐ BFS๋ฅผ ์‚ฌ์šฉ

(1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

(2) ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

(3) (2) ๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

BFS ์˜ˆ์ œ ์ฝ”๋“œ

# BFS
from collections import deque #deque ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„

def bfs(graph, start, visited):
  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 = [
    [],
    [2, 3, 4],  # 1๋ฒˆ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
    [5, 6],
    [1],
    [1, 7],
    [2],
    [2],
    [4]
]

visited = [False] * 8
# ํ•จ์ˆ˜ ํ˜ธ์ถœ
bfs(graph, 1, visited)

 

Deque(Double-Enabled Queue, ๋ฑ)


- ์Šคํƒ๊ณผ ํ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๊ฐ–๊ณ  ์žˆ์Œ

- ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” ์†๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จ

- ํŒŒ์ด์ฌ์œผ๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ (collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•จ)

- from collections import deque

- ์‚ญ์ œ : popleft() / ์‚ฝ์ž… : append(item)

 

 

 

 

 

์ฐธ๊ณ ๋ฌธํ—Œ ๋ฐ ์ถœ์ฒ˜ | ๋‚˜๋™๋นˆ. 2020. ์ด๊ฒƒ์ด ์ทจ์ค€์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ. ํ•œ๋น›๋ฏธ๋””์–ด