DOing
[์๊ณ ๋ฆฌ์ฆ] BFS with Python ๋ณธ๋ฌธ
๐ก BFS ์๊ณ ๋ฆฌ์ฆ
Breath-First Search, ๊ทธ๋ํ์์ ๊ฐ๊น์ด ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ํ๋ค.
๋ฐ์ดํฐ๊ฐ N๊ฐ ์์๋ O(N)์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ์๊ฐ์ DFS๋ณด๋ค ์ข์ํธ์ด๋ค.
[DFS vs BFS]
๋์ ๋ฐฉ์ | ๋์ ์๋ฆฌ | ๊ตฌํ | ์ธ์ ํ ๋ ธ๋๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด? | |
DFS | ๋ฉ๋ฆฌ ์๋(๊น๊ฒ ์๋)๋ ธ๋ ๋ถํฐ ํ์ | ์คํ | ์ฌ๊ท ํจ์ ์ด์ฉ | ํ๊ฐ์ฉ ๋ฃ์ |
BFS | ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ | ํ | ํ ์๋ฃ๊ตฌ์กฐ ์ด์ฉ | ํ๋ฒ์ ๋ค ๋ฃ์ |
๐ก BFS ๋์๊ณผ์
1. ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
2. ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค,
3. 2๋ฒ๊ณผ์ ์ ๋์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ธ๋์ ํ์์์(ํ์ ๋ค์ด๊ฐ ์์)๋ ๋ค์๊ณผ ๊ฐ๋ค
1->(2->3->8)->(7->4->5)->6
์์ธํ ๋ณด๋ฉด (2, 3, 4)๋ ๋ชจ๋ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๊ณ , (7, 4, 5) ๋ชจ๋ ๊ฑฐ๋ฆฌ๊ฐ 2์ด๊ณ , 6๋ ๊ฑฐ๋ฆฌ๊ฐ 3์ด๋ค. ์ฆ, ๊ฑฐ๋ฆฌ์์ผ๋ก ์ ๋ ฌ๋๋ค. ์ด๋ฌํ ํน์ฑ์ ์ด์ฉํด์ ๊ฐ ๊ฐ์ ๋น์ฉ์ด ๋ชจ๋ ๊ฐ๋ค๋ ๊ฐ์ ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ์๋ ์ฌ์ฉ๋ ์ ์๋ค.
๐ก BFS ๊ตฌํ ์ฝ๋
from collections import deque
# BFS
def bfs(graph, start, visited):
# ํ ๊ตฌํ์ ์ํด deque๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
# ํ์ ์์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = True
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# ํ์์ ํ๋์ ์์๋ฅผ ๊บผ๋ด์ ์ถ๋ ฅ
n = queue.popleft()
print(n, end='')
# ๊บผ๋ธ ์์์ ์ธ์ ๋
ธ๋ ํ์ธ
for i in graph[n]:
# ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
if not visited[i]:
queue.append(i)
visited[i]=True
# 2์ฐจ์ ๋งต์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
graph=[
[], # 0๋ฒ ๋
ธ๋ ๋น์ฐ๊ธฐ
[2,3,8], #1๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ 2,3,8๋
ธ๋
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# ๋ฐฉ๋ฌธ ์ ๋ณด
visited = [False]*(8+1) #(์ด ๋
ธ๋์ ๊ฐฏ์)+์ธ๋ฑ์ค 0
# bfsํธ์ถ
bfs(graph, 1, visited)
๐ก BFS ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
Q1. ๋ฏธ๋ก ํ์ถ
๋๋น์ด๋ N*M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ํํ์ ๋ฏธ๋ก์ ๊ฐํ์๋ค. ๋ฏธ๋ก์๋ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผํ๋ค. ๋๋น์ด์ ์์น๋ (1,1)์ด๊ณ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N,M)์ ์์น์ ์กด์ฌํ๋ฉฐ ํ๋ฒ์ ํ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ์ด๋ ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด์๋ค. ๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋๋ค. ์ด๋ ๋๋น์ด๊ฐ ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ์์ค. ์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํ๋ค.
* ์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ๋ ์ ์ N,M(4<= N,M <= 200)์ด ์ฃผ์ด์ง๋๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ๊ฐ M์ ์ ์(0ํน์ 1)๋ก ๋ฏธ๋ก์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๊ณต๋ฐฑ ์์ด ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ ์๋๋ค. ๋ํ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ํญ์ 1์ด๋ค.
* ์ถ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ์ต์ ์ด๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ ์์ | ์ถ๋ ฅ ์์ |
5 6 101010 111111 000001 111111 111111 |
10 |
[๋ฌธ์ ์์ด๋์ด]
BFS๋ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฌธ์ ์๋ ์ฌ์ฉ๋ ์ ์๋ค.
๋ฐฉ๋ฌธํ ๋ ธ๋์ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฌ๋ฉด ํ๋ฒ๋ ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ 1, ๊ฐ์ง ๋ชปํ ๊ณณ์ 0, ์ด๋ฏธ ๊ฐ ๊ณณ์ 1๋ณด๋ค ํฐ๊ฐ์ด๋ค.
[์ฝ๋]
๊ตฌํ์, visited ๋ฆฌ์คํธ๊ฐ ํ์ํ์ง ์๋ค.
๋ฏธ๋ก์ ์ ๋ณด๋ฅผ ๋ด์ graph๋ฅผ ํ๋ฒ๋ ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ 1, ๊ฐ์ง ๋ชปํ ๊ณณ์ 0์ผ๋ก ์ ์งํ๊ณ ์ด๋ฏธ ๊ฐ ๊ณณ์ 1๋ณด๋ค ํฐ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
from collections import deque
# n๊ฐ์ ์ค, m๊ฐ์ ์ด
n, m = map(int,input().split())
# ๋ฏธ๋ก์ ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ
graph=[]
for i in range(n):
graph.append(list(map(int,input())))
# ๋ฐฉํฅ ์ ๋ณด(์ํ์ข์ฐ)
dx = [-1,1,0,0]
dy = [0,0,-1,1]
# ์ถ๋ฐ ๋
ธ๋
queue = deque()
deque.append((0,0))
# ํน์ deque([(0,0)])
while queue :
# ํ์์ ํ๋์ ์์๋ฅผ ๊บผ๋ด์ ์ถ๋ ฅ
x, y = queue.popleft()
# ๊บผ๋ธ ์์์ ์ธ์ ๋
ธ๋ ํ์ธ
for i in range(len(dx)):
nx = x+dx[i]
ny = y+dy[i]
# ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋
ธ๋ ๋ฌด์
if nx>n-1 or ny>m-1 or nx<0 or ny<0 :
continue
# ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
# ์ฒ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ค
if graph[nx][ny]==1:
queue.append((nx,ny))
graph[nx][ny] = graph[x][y]+1 # ์ง์ ๋
ธ๋+1
print(graph[n-1][m-1])
์ถ์ฒ :
์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค(์ด๋๋น ์ )
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์งํ์ with Python (0) | 2021.05.22 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ with Python (1) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] DFS with Python (0) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] ๊ตฌํ with Python (0) | 2021.05.21 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋(ํ์๋ฒ) with Python (0) | 2021.05.20 |