7
0110100
0110101
1110101
0000111
0100000
0111110
0111000
''' 내가 품 '''
import sys
sys.setrecursionlimit(10**5)
def dfs(y, x, graph, n, house_n):
graph[y][x] = 0
house_n += 1 # 매우중요 => 집 하나
# 상 하 좌 우
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if ny < 0 or n <= ny or nx < 0 or n <= nx: continue
if graph[ny][nx] == 1:
house_n = dfs(ny, nx, graph, n, house_n) # 재귀 끝나는 조건은 따로 없다!
return house_n
n = int(input())
graph = [list(map(int,input())) for _ in range(n)] # (중요) .split()없이 받아야함!
graph = [[0, 1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 0, 1], [1, 1, 1, 0, 1, 0, 1], [0, 0, 0, 0, 1, 1, 1], [0, 1, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 0, 0, 0]]
total_num = 0
house_n = 0
house_nums = []
for y in range(n):
for x in range(n):
if graph[y][x] == 1:
house_nums.append(dfs(y, x, graph, n, house_n))
total_num += 1 # (중요) 여기서 순회 1회 끝남!!!!!
house_n = 0 # (중요) 여기서 초기화!!!!!
house_nums.sort() # (중요) 이런 자잘한 조건은 항상 잊지마라
print(total_num)
print(*house_nums, sep="\n")
step 0
step 1
step 2
step 3
따라서 총 3개의 클러스터가 있다고 볼 수 있으며(=dfs/bfs 순회 횟수)
각 dfs를 돌면서 카운팅한 것(= house_n)이 각 클러스터 내의 원소 수