DFS
๋ ํ์ํ๋ ์์๋ฅผ ์ต๋ํ ๊น๊ฒ ๋ฐ๋ผ๊ฐ์ผ ํฉ๋๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ชจ๋ ๋
ธ๋๋ค์ ์ ์ฅํด๋๊ณ ,
"๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฃ์ ๋
ธ๋"๋ฅผ ๊บผ๋ด์ ํ์ํ๋ฉด ๋ฉ๋๋ค - > ๊ทธ๋์ ์คํ(Stack)์ ์ฌ์ฉ
BFS
๋ ํ์ฌ ์ธ์ ํ ๋
ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํด์ผ ํฉ๋๋ค.
์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ชจ๋ ๋
ธ๋๋ค์ ์ ์ฅํด๋๊ณ , ๊ฐ์ฅ ์ฒ์์ ๋ฃ์ ๋
ธ๋๋ฅผ ๊บผ๋ด์ ํ์ํ๋ฉด ๋ฉ๋๋ค. "๊ฐ์ฅ ์ฒ์์ ๋ฃ์ ๋
ธ๋" -> ํ(Queue)๋ฅผ ์ฌ์ฉ
๊ตฌํ ๋ฐฉ๋ฒ
1. ๋ฃจํธ ๋
ธ๋๋ฅผ ํ์ ๋ฃ์ต๋๋ค.
2. ํ์ฌ ํ์ ๋
ธ๋๋ฅผ ๋นผ์ visited์ ์ถ๊ฐํฉ๋๋ค.
3. ํ์ฌ ๋ฐฉ๋ฌธํ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
4. 2๋ถํฐ ๋ฐ๋ณตํฉ๋๋ค.
5. ํ๊ฐ ๋น๋ฉด ํ์์ ์ข
๋ฃํฉ๋๋ค.
graph = {
1: [2, 3, 4],
2: [5],
3: [5],
4: [],
5: [6,7],
6: [],
7: [3],
}
ํ๋ฅผ ๋ค์ ๊ธฐ์ตํ์ ๐ก
https://velog.io/@chanloper/%ED%81%90Queue
def bfs_queue(start):
visited = [start] # ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๋ ๋ฆฌ์คํธ, ์์ ๋
ธ๋๋ก ์ค์ (์ด๊ธฐํ)
q = deque([start]) # ํ(queue), ์์ ๋
ธ๋๋ก ์ด๊ธฐํ๋ dequq ๊ฐ์ฒด ์์ฑ
while q: # ํ์ ๋ฐฉ๋ฌธํ ๋
ธ๋๊ฐ ๋จ์ ์๋ ๋์ ๋ฐ๋ณต
node = q.popleft() # ํ์ ์ผ์ชฝ์์ ๋
ธ๋๋ฅผ ํ๋ ๊บผ๋ ( ๊ฐ์ฅ ์ค๋๋ ๋
ธ๋ )
for adj in graph[node]: # ํ์ฌ ๋
ธ๋์ ์ธ์ ๋
ธ๋๋ค์ ์ํ
if adj not in visited: # ์ธ์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋์ง ์์๋ค๋ฉด
q.append(adj) # ํ์ ์ธ์ ๋
ธ๋๋ฅผ ์ถ๊ฐ(append)ํ์ฌ ๋์ค์ ๋ฐฉ๋ฌธ
visited.append(adj) # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
return visited # ๋ฐฉ๋ฌธํ ์์๋๋ก ๋
ธ๋๋ค์ ๋ด์ visited ๋ฆฌ์คํธ ๋ฐํ
assert bfs_queue(1) == [1, 2, 3, 4, 5, 6, 7]
BFS๋ก ์ฌ์ ๊ฐ์ ์ฐพ๊ธฐ
์ฒด๊ฐ ๋์ด๋ : โญ๏ธโญ๏ธโญ๏ธโโ
from collections import deque
def island_bfs(grid):
# ์, ํ, ์ข, ์ฐ ๋ฐฉํฅ์ ๋ํ๋ด๋ ๋ฐฐ์ด
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
# ๊ทธ๋ฆฌ๋์ ํ๊ณผ ์ด ๊ธธ์ด
rows, cols = len(grid), len(grid[0])
# ์ฌ์ ๊ฐ์๋ฅผ ์ธ๋ ๋ณ์ 'cnt'
cnt = 0
# ๊ทธ๋ฆฌ๋์ ๊ฐ ์
์ ํ๋์ฉ ํ์
for row in range(rows):
for col in range(cols):
# ํ์ฌ ์
์ด ์ก์ง('1')๊ฐ ์๋๋ฉด ๊ฑด๋๋
if grid[row][col] != '1':
continue
# ์๋ก์ด ์ฌ์ ๋ฐ๊ฒฌ, ์ฌ ๊ฐ์๋ฅผ ์ฆ๊ฐ์ํด (cnt+=1)
cnt += 1
q = deque([row,col]) # ์์์ ์ ํ์ ์ถ๊ฐํ์ฌ ์ด๊ธฐํ
while q:
x, y = q.popleft() # ํ์์ ํ๋์ ์ขํ๋ฅผ ๊บผ๋
for i in range(4): # ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ํด ํ์
nx = x + dx[i] # ์๋ก์ด x ์ขํ ๊ณ์ฐ
ny = y + dy[i] # ์๋ก์ด y ์ขํ ๊ณ์ฐ
# ์๋ก์ด ์ขํ๊ฐ ๊ทธ๋ฆฌ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ์ก์ง๊ฐ ์๋๋ฉด ๊ฑด๋๋
if nx < 0 or nx >= rows or ny < 0 or ny >= cols or grid[nx][ny] != '1':
continue
grid[nx][ny] = '0' # ๋ฐฉ๋ฌธํ ์ก์ง๋ฅผ '0'์ผ๋ก ํ์ํ์ฌ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
q.append((nx,ny)) # ์๋ก์ด ์ขํ๋ฅผ ํ์ ์ถ๊ฐํ์ฌ BFS ๊ณ์ ์งํ
# ํ๋ฒ์ BFS ํ์์ด ๋๋๋ฉด ํด๋น ์ฌ์ ํ์์ ์๋ฃํ๊ณ ๋ค์ ์
๋ก ์ด๋
return cnt # ์ฌ์ ๊ฐ์๋ฅผ ๋ฐํ
์ด์ ์ ํ๋ stack์ผ๋ก ๊ตฌํํ ์ฌ์ ๊ฐ์ ์ฐพ๊ธฐ์ ์ ์ฌํ๋ค.