package dfs.Day250301;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Day01_단지번호붙이기_re {
static int n;
static int cnt = 1;
static int[][] square;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static boolean[][] visited;
static List<Integer> result;
public static void solution(int[][] square) {
result = new ArrayList<>();
visited = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (square[i][j] == 1 && !visited[i][j]) {
dfs(i, j);
result.add(cnt);
cnt = 1;
}
}
}
}
public static void dfs(int x, int y) {
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int xx = dx[i] + x;
int yy = dy[i] + y;
if (xx >= 0 && yy >= 0 && xx < n && yy < n && !visited[xx][yy] && square[xx][yy] == 1) {
dfs(xx, yy);
cnt++;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
square = new int[n][n];
for (int i = 0; i < n; i++) {
String s = br.readLine();
for (int j = 0; j < n; j++) {
square[i][j] = s.charAt(j) - '0';
}
}
solution(square);
System.out.println(result.size());
Collections.sort(result);
for (int i : result) {
System.out.println(i);
}
}
}

그림을 보면 0은 집이 없는 곳 1은 집이 있는 곳입니다.
그리고 집이 여러개가 연결되어있으면 단지로 구별하고 이 단지가 총 몇단지인지 몇개의 단지가 있는지 출력하는 문제입니다.
정사각형으로 5≤N≤25 입력값이 주어지고 시간제한은 1초입니다.
출력값은 오름차순으로 해야되기 때문에 정렬을 한번 해줘야 합니다.
30~40분이 지나서 해결하지 못해서 다른 사람의 코드를 참고 했습니다.