DFS을 이용한 풀이
# 입력
import sys
read = sys.stdin.readline
n = int(read().strip())
graph = []
for _ in range(n):
graph.append(list(map(int, read().strip())))
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
# 처리 - dfs 활용
def DFS(x, y):
if not 0<=x<n or not 0<=y<n:
return False
if graph[x][y] == 1:
global count
count += 1
graph[x][y] = 0
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
DFS(nx, ny)
return True
return False
count = 0
ans = []
for i in range(n):
for j in range(n):
if DFS(i,j):
ans.append(count)
count = 0
print(len(ans))
for a in sorted(ans):
print(a)
BFS를 이용한 풀이
# 입력
import sys
read = sys.stdin.readline
n = int(read().strip())
graph = []
for _ in range(n):
graph.append(list(map(int, read().strip())))
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
# 처리 - BFS 활용
def BFS(x, y):
from collections import deque
queue = deque([(x,y)])
graph[x][y] = 0
count = 1
while queue:
x,y = queue.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0<=nx<n and 0<=ny<n and graph[nx][ny] == 1:
graph[nx][ny] = 0
queue.append((nx,ny))
count += 1
return count
count = 0
ans = []
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
ans.append(BFS(i,j))
count = 0
print(len(ans))
for a in sorted(ans):
print(a)
CODE REVIEW
- DFS와 BFS 두 방법으로 풀 수 있는 문제였다.
- BFS의 경우 queue을 이용해서 차례대로 구역 안의 1인 영역을 찾아내었고,
- DFS의 경우 재귀를 통해 찾아내었다.