์ค๋๋ง์
๋๋ค์
ํ ์ค ์ํ์ค๋น๋๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ ^^ ํ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ผ๋ฅธ DFS,BFS๋ฅผ ๊ณต๋ถํ๋ฌ ๊ฐ๋ด
์๋ค
โ
์ธ์ ๋ฆฌ์คํธ/ํ๋ ฌ ๊ตฌํ
โ
์ฌ๊ท DFS vs ํ BFS ๋น๊ต
from collections import deque
# ์์ ๊ทธ๋ํ (์ธ์ ๋ฆฌ์คํธ)
graph = {
1: [2, 3],
2: [4, 5],
3: [6],
4: [],
5: [],
6: []
}
# ----------------
# DFS (์ฌ๊ท)
# ----------------
def dfs_recursive(v, visited):
visited.add(v)
do_something(v) # <- ์ฌ๊ธฐ์ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ ์ํ๋ ๋์
print(v, end=" ")
for nxt in graph[v]: # ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ ํ์
if nxt not in visited: # ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์์ ๊ฒฝ์ฐ
dfs_recursive(nxt, visited)
# ----------------
# DFS (์คํ)
# ----------------
def dfs_stack(start):
visited = set()
stack = [start]
while stack: # ๋น์ด์ง๋๊น์ง
v = stack.pop()
if v not in visited:
visited.add(v)
print(v, end=" ")
# ์ญ์์ผ๋ก ๋ฃ์ด์ผ ์์ ๋ฒํธ ๋จผ์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅ
stack.extend(graph[v])
DFS๋ ๊น์ด ์ฐ์ ํ์์ด๊ณ , BFS๋ ๋๋น ์ฐ์ ํ์์ด๋ค.
DFS๋ ๊น์ด๊ฐ ๋์ธ, ๋ ํ์ํ ๊ฒ ์๋ ๋ฆฌ์คํธ์ ๊ฐ๋๊น์ง ํ์ํ๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ ๋์ผ ๋์ค์ ์๋ ๋ค๋ฅธ ๋ฆฌ์คํธ๊ฐ ์๋๋ผ๋, ๋ด๊ฐ ํ์ํ๋ ๋ฆฌ์คํธ์ ํ์ ๋ฆฌ์คํธ๋ฅผ ๋จผ์ ๊ฐ์ผํ๋ค.
ํด๋น ์ํฉ์ ์ค์ ์คํ์ ์ํ๋ก ์ค๋ช
ํด๋ณด์
1. ๋
ธ๋ A๋ฅผ ํ์ํ๊ธฐ ์์ : [(์ด์ ๋์ค ๋
ธ๋), ... ,(๋์ผ ๋์ค ๋
ธ๋)] -> ๋
ธ๋ A๋ฅผ ๋งจ ๋ค์์ ๊บผ๋
2. ๋
ธ๋ A์ ์ฐ๊ฒฐ๋ ํ์ ๋
ธ๋์ ๋ฆฌ์คํธ : graph[A] = [a,b,c]
3. ํ์ ๋
ธ๋ ๋ด๊ธฐ ๋์ ํ : [(์ด์ ๋์ค ๋
ธ๋), ... ,(๋์ผ ๋์ค ๋
ธ๋), a, b, c]
์ดํ ํ์ํ ๋ ธ๋์ ์ ๊ทผํ๊ธฐ ์ํด์๋, ๋ฐฉ๊ธ ์ ์ ๋ค์ด์จ ๋ ธ๋๋ฅผ ๊บผ๋ด๋ ์ ์ ํ์ถ์ ์คํ์ด ํ์ํ๋ค. ์์์ ๊บผ๋ด๋ฉด, ํ์ ๋ ธ๋๊ฐ ์๋ ์๋ฑํ ๋ ธ๋๋ฅผ ํ์ํ๊ฒ ๋๋ค. ๋ฐ๋๋ก ๋์ผ ๋์ค์ ๋ ธ๋์ ์ ๊ทผํด์ผํ๋ bfs๋ ์ ์ ์ ์ถ์ ํ๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
๋ํ, DFS์ ์๋ฃ๊ตฌ์กฐ๋๋ฌธ์ ๋ ธ๋ ์์๊ฐ ๋ฐ์ ๋๋ค๋ ๊ฒ์ ์ ์ํ์,
from collections import deque
# ์์ ๊ทธ๋ํ (์ธ์ ๋ฆฌ์คํธ)
graph = {
1: [2, 3],
2: [4, 5],
3: [6],
4: [],
5: [],
6: []
}
# ----------------
# BFS (ํ)
# ----------------
def bfs(start):
visited = set([start])
queue = deque([start])
while queue:
v = queue.popleft()
print(v, end=" ")
for nxt in graph[v]:
if nxt not in visited:
visited.add(nxt)
queue.append(nxt)
์ธ์ ํ๋ ฌ: 2์ฐจ์ ๋ฐฐ์ด, graph[a][b] = 1 ์ด๋ฉด ์ฐ๊ฒฐ๋จ.
์ธ์ ๋ฆฌ์คํธ: ๊ฐ ๋ ธ๋๋ง๋ค ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ๋ฆฌ์คํธ๋ก ์ ์ฅ.
๊ตฌ๋ถ | DFS | BFS |
---|---|---|
ํ์ ๋ฐฉ์ | ๊น๊ฒ ๋ค์ด๊ฐ | ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ |
์๋ฃ๊ตฌ์กฐ | ์คํ(์ฌ๊ท) | ํ |
ํ์ฉ | ๊ฒฝ๋ก ํ์, ๋ฐฑํธ๋ํน | ์ต๋จ ๊ฑฐ๋ฆฌ, ๋ ๋ฒจ ํ์ |
์๋ | ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋น ๋ฆ, ์ต๋จ ๊ฑฐ๋ฆฌ ๋ณด์ฅ์ ์์ | ๊ฐ์ ์ด ๊ท ์ผํ๋ฉด ์ต๋จ ๊ฑฐ๋ฆฌ ๋ณด์ฅ |
โ๏ธ๊ฐ์ ์ด ๋์ผํ๋ค๋ ๊ฒ์ ์๋ฏธ : ๋
ธ๋๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ชจ๋ 1๋ก ๋์ผ
-> ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ BFS์์ ์ด๋ค ๋
ธ๋์ ์ฒ์ ๋๋ฌํ ์๊ฐ์ด ๊ณง ์ต๋จ ๊ฑฐ๋ฆฌ์์ ๋ณด์ฅ
print(" ".join(map(str, bfs)))
ํ์ด ๋งํฌ : ๐ ๊ฐ์ธ ๋ ธ์ ๋งํฌ
ํ์ค ์ ๋ฆฌ : ๊ธฐ์ค์ธ๋ฑ์ค์ ์ ํจํ ์ํ์ข์ฐ ์ขํ ๊ตฌํ๊ธฐ
#์ธ๋ถ์์ ์ขํ ์ค์
dirs = [(-1,0),(1,0),(0,-1),(0,1)]
#์๋ ์ขํ
for dx, dy in dirs:
#์ ๋ ์ขํ๋ก ๋ณ๊ฒฝ
nx, ny = x + dx, y + dy
#์ ๋ ์ขํ์ ์ ํจ์ฑ ๊ฒ์ฌ
if 0 <= nx < n and 0 <= ny < n \
and grid[nx][ny] == 1 and not visited[nx][ny]:
# ์ํ๋ ๋์
๋ถํ์ํ route
์ฌ์ฉ
์ฐจ๋ก๋๋ก ์ํํด๋ ๋์ผ
get_index
๋ผ๋ ํจ์ ๋ถํ์
#์ธ๋ถ์์ ์ขํ ์ค์
dirs = [(-1,0),(1,0),(0,-1),(0,1)]
#์๋ ์ขํ
for dx, dy in dirs:
#์ ๋ ์ขํ๋ก ๋ณ๊ฒฝ
nx, ny = x + dx, y + dy
#์ ๋ ์ขํ์ ์ ํจ์ฑ ๊ฒ์ฌ
if 0 <= nx < n and 0 <= ny < n \
and grid[nx][ny] == 1 and not visited[nx][ny]:
# ์ํ๋ ๋์
import sys
from collections import deque
input = sys.stdin.readline
# ๊น์ด ํ์ ์๋๋ฉด ๋๋น ํ์?
n = int(input())
arr = [[int(x) for x in input().strip()] for _ in range(n)]
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
visited = [[0] * n for _ in range(n)]
k = []
sum = 0
stack = deque()
for i in range(n):
for j in range(n):
if arr[i][j] == 1 and visited[i][j] != 1:
stack.append((i, j))
number = 0
while stack:
# ๊บผ๋ด๊ธฐ
x, y = stack.pop()
# ๋ฐฉ๋ฌธ ๊ฒ์ฌ์ ๋ฐฉ๋ฌธ ํ์
if visited[x][y] == 1:
continue
visited[x][y] = 1
number += 1
for dx, dy in dirs:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 1:
stack.append((nx, ny))
if number != 0:
k.append(number)
k.sort()
print(len(k))
for x in k:
print(x)
push
์ ์ ๋ฐฉ๋ฌธ ๊ฒ์ฌimport sys
from collections import deque
input = sys.stdin.readline
# ๊น์ด ํ์ ์๋๋ฉด ๋๋น ํ์?
n = int(input())
arr = [[int(x) for x in input().strip()] for _ in range(n)]
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
visited = [[0] * n for _ in range(n)]
k = []
sum = 0
stack = deque()
for i in range(n):
for j in range(n):
if arr[i][j] == 1 and visited[i][j] != 1:
stack.append((i,j))
visited[i][j] = 1
number = 1
while stack:
# ๊บผ๋ด๊ธฐ
x, y = stack.pop()
for dx, dy in dirs:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < n and arr[nx][ny] == 1 and visited[nx][ny] != 1:
visited[nx][ny] = 1
number += 1
stack.append((nx, ny))
if number != 0:
k.append(number)
k.sort()
print(len(k))
for x in k:
print(x)
๋ ์ด์ฌํ์