'BFS'를 사용합시다.
어떤 좌표에서 위, 아래, 오른쪽, 왼쪽으로 나아갈 수 있는데
arr[i][j] == 1 && visited[i][j] = false
(배열의 해당 위치에 집이 존재하고 방문하지 않은 곳) 이면,
C++ 기준으로
queue<pair<int,int>>
로 선언된 큐에 push를 해줍니다.
이 작업을 큐가 빌 때까지 반복하는데 큐의 front를 이용해서 가능한 곳에 모두 접근할 수 있도록 합시다.
이 과정에서 큐에 push하거나 pop하는 경우 cnt를 늘려주면, 세대 수를 셀 수 있어요. 그럼 끝~
마지막에 단지 별 세대수를 출력할 때는 꼭 '오름차순 정렬'을 적용해주세요! (이것때문에 고생많이 했어요ㅜ)
from collections import deque
def BFS(si,sj):
global N,X,visit
Q=deque()
Q.append((si,sj))
visit[si][sj]=True
cnt=1
while Q:
i,j=Q.popleft()
if i>0 and X[i-1][j] and not visit[i-1][j]:
Q.append((i-1,j))
visit[i-1][j]=True
cnt+=1
if i<N-1 and X[i+1][j] and not visit[i+1][j]:
Q.append((i+1,j))
visit[i+1][j]=True
cnt+=1
if j>0 and X[i][j-1] and not visit[i][j-1]:
Q.append((i,j-1))
visit[i][j-1]=True
cnt+=1
if j<N-1 and X[i][j+1] and not visit[i][j+1]:
Q.append((i,j+1))
visit[i][j+1]=True
cnt+=1
return cnt
N=int(input())
X,ans,visit=[],[],[[False]*N for i in range(N)]
for i in range(N):
X.append([*map(int,list(input()))])
for i in range(N):
for j in range(N):
if X[i][j] and not visit[i][j]:
ans.append(BFS(i,j))
ans.sort()
print(len(ans))
for i in ans:
print(i)