graph = {
1: [2, 3, 4],
2 : [5],
3: [5],
4: [],
5: [6,7],
6: [],
7: [3],
}
def dfs_recursive(node,visited):
# ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited.append(node)
# ์ธ์ ๋
ธ๋ ๋ฐฉ๋ฌธ
for adj in graph[node]:
if adj not in visited:
dfs_recursive(adj,visited)
return visited
def dfs_stack(start):
visited = [] # ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๋ ๋ฆฌ์คํธ
stack = [start] # ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๋ด๋ ์คํ, ์์ ๋
ธ๋๋ก ์ด๊ธฐํ
# ์คํ์ ๋ฐฉ๋ฌธํ ๋
ธ๋๊ฐ ๋จ์์๋ ํ ์๋ ๋ก์ง์ ๋ฐ๋ณตํ๋ค.
while stack:
top = stack.pop() # ์ ์ผ ์ต๊ทผ์ ์ฝ์
๋ ๋
ธ๋๋ฅผ ๊บผ๋
visited.append(top) # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
for adj in graph[top]: # ํ์ฌ ๋
ธ๋์ ์ธ์ ๋
ธ๋๋ค์ ํ์
if adj not in visited: # ์ธ์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋์ง ์์๋ค๋ฉด
stack.append(adj) # ์คํ์ ์ถ๊ฐํ์ฌ ๋์ค์ ๋ฐฉ๋ฌธ
return visited # ๋ฐฉ๋ฌธํ ์์๋๋ก ๋
ธ๋๋ค์ ๋ฐํ
visited ๋ฆฌ์คํธ : ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ฆฌ์คํธ์
๋๋ค.
stack ๋ฆฌ์คํธ : DFS๋ฅผ ์ํ ์คํ์
๋๋ค. ์ด๊ธฐ์๋ ์์ ๋
ธ๋์ธ 'start'๋ก ์ค์ (์ด๊ธฐํ)๋ฉ๋๋ค.
while stack : ์คํ์ด ๋น์ด์ง ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ์คํ์ ๋จ์์๋ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ค์ ์๋ฏธํฉ๋๋ค.
top = stack.pop() : ์คํ์์ ๋งจ ์(์ต๊ทผ์ ์ถ๊ฐ๋) ๋
ธ๋๋ฅผ ๊บผ๋ด์ด 'top'์ ํ ๋นํฉ๋๋ค. ์ด ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํฉ๋๋ค.
visitde.append(top): ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ visited ๋ฆฌ์คํธ์ ์ถ๊ฐ(append)ํฉ๋๋ค
for adj in graph[top] : ํ์ฌ ๊บผ๋ธ ๋
ธ๋ top์ ์ธ์ ๋
ธ๋๋ค์ ํ์ํฉ๋๋ค.
if adj not in visited : ์ธ์ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋์ง ์์๋ค๋ฉด, ์คํ์ ์ถ๊ฐํ์ฌ ๋์ค์ ๋ฐฉ๋ฌธํฉ๋๋ค.
return visited : ๋ชจ๋ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธํ ํ, ๋ฐฉ๋ฌธํ ์์๋๋ก ๋
ธ๋๋ค์ ๋ด์ visited ๋ฆฌ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
์ฒด๊ฐ ๋์ด๋ : โญ๏ธโญ๏ธโญ๏ธโญ๏ธโ
def island_dfs_stack(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
# ์คํ์ ์ด๊ธฐํํ๊ณ ํ์ฌ ์
์ ์คํ์ ์ถ๊ฐ
stack = [(row,col)]
# ์คํ์ด ๋น์ด์์ ๋๊น์ง ๋ฐ๋ณต
while stack:
x,y = stack.pop() # ์คํ์์ ํ๋์ ์
์ ๊บผ๋
grid[x][y] = '0' # ๊บผ๋ธ ์
์ '0'์ผ๋ก ํ์ํ์ฌ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ
# ๋ค ๋ฐฉํฅ์ ํ์
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
# ์คํ์ ์๋ก์ด ์ขํ๋ฅผ ์ถ๊ฐํ์ฌ DFS ์งํ
stack.append((nx,ny))
# ํ๋ฒ์ DFS ํ์์ด ๋๋๋ฉด ํด๋น ์ฌ์ ํ์์ ์๋ฃํ๊ณ ๋ค์ ์
๋ก ์ด๋
return cnt # ์ฌ์ ๊ฐ์๋ฅผ ๋ฐํ