๊ทธ๋ฆฌ๋ ; ํ์ฌ ๊ฐ์ฅ ์ข์ ๋ณด์ด๋ ๊ฒ๋ง์ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ์ฌ ์ํฉ์์ ์ง๊ธ ๋น์ฅ ์ข์ ๊ฒ๋ง ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ
- ๋งค ์๊ฐ ๊ฐ์ฅ ์ข์๋ณด์ด๋ ๊ฒ์ ์ ํํ๋ฉฐ, ํ์ฌ์ ์ ํ์ด ๋์ค์ ๋ฏธ์น ์ํฅ์ ๋ํด์๋ ๊ณ ๋ คํ์ง ์์
- ๋ฌธ์ ์์ '๊ฐ์ฅ ํฐ ์์๋๋ก','๊ฐ์ฅ ์์ ์์๋๋ก' ๋ฑ๋ฑ ํํ์ด ๋์ค๋ฉด ๊ทธ๋ฆฌ๋๋ก ํ ์ ์๋์ง ์๊ฐํด๋ณด๊ธฐ
- ๊ทธ๋ฆฌ๋์ ์ ๋ ฌ๋ฌธ์ ๋ ์ง์ ์ด๋ค ์ถ์ ๋๊ธฐ๋ ํจ
๊ตฌํ ; ๋จธ๋ฆฟ์์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๊ณ ๋น ๋ฅด๊ฒ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ฑํ๊ธฐ
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐฉํฅ์ ์ค์ ํด์ ์ด๋ํ๋ ๋ฌธ์ ์ ํ์์๋ 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
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 ํ์ด์ฌ. ํ๋น๋ฏธ๋์ด
'์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[KAKAO|์นด์นด์ค ๊ธฐ์ถ๋ฌธ์ ] ๋ฉ๋ด ๋ฆฌ๋ด์ผ (0) | 2021.04.21 |
---|---|
[KAKAO|์นด์นด์ค ๊ธฐ์ถ๋ฌธ์ ] ์ ๊ท ์์ด๋ ์ถ์ฒ (0) | 2021.04.21 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ์ ๋ฆฌ (4) (0) | 2021.03.15 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ์ ๋ฆฌ (3) (0) | 2021.03.11 |
์ฝ๋ฉํ ์คํธ ๊ด๋ จ ๋ด์ฉ์ ๋ฆฌ (2) (0) | 2021.02.20 |