728x90
import java.io.*;
import java.util.*;
public class Main {
public static int count = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int[][] matrix = new int[n][n];
boolean[][] visited = new boolean[n][n];
for(int ii = 0 ; ii < n ; ii++)
{
String parsing = br.readLine();
for(int jj = 0 ; jj < n ; jj++)
matrix[ii][jj] = parsing.charAt(jj) - '0';
}
/* 파싱잘되었나 확인
for(int ii = 0 ; ii < n ; ii++)
{
for(int jj = 0 ; jj < n ; jj++)
System.out.print(matrix[ii][jj]);
System.out.println();
}
*/
int result = 0;
ArrayList<Integer> list_count = new ArrayList<>();
for(int ii = 0 ; ii < n ; ii++)
{
for(int jj = 0 ; jj < n ; jj++)
{
if(dfs(n, ii, jj, matrix, visited))
{
result+=1;
list_count.add(count); /* 정렬이 필요해서 리스트에 넣는다 */
count = 0;
}
}
}
// 오름차순 정렬
Collections.sort(list_count);
// answer
System.out.println(result);
for(int ii = 0 ; ii < list_count.size(); ii++)
System.out.println(list_count.get(ii));
br.close();
}
public static boolean dfs(int n, int x, int y, int[][] matrix, boolean[][] visited)
{
/* 행렬내에 갈수 없는 곳들 */
if(x < 0 || x >= n || y < 0 || y >= n)
return false;
/* 같은 영역이면서 방문하지 않았다 */
if(matrix[x][y] == 1 && visited[x][y] == false )
{
visited[x][y] = true; /* 방문처리 */
count++; /* 아파트개수 체크 */
/* 영역을 확장해가는 느낌 */
dfs(n, x-1, y, matrix, visited); /* up */
dfs(n, x+1, y, matrix, visited); /* down */
dfs(n, x, y+1, matrix, visited); /* right */
dfs(n, x, y-1, matrix, visited); /* left */
return true;
}
else
return false;
}
}
https://www.acmicpc.net/problem/2667
728x90
'코딩 테스트' 카테고리의 다른 글
2839번 설탕배달(자바, java) - 그리디 (0) | 2023.01.09 |
---|---|
11399번 ATM(자바, java) - 그리디 (0) | 2023.01.09 |
2606번 바이러스(자바, java) - DFS (0) | 2023.01.09 |
프로그래머스 네트워크 - DFS (0) | 2023.01.09 |
프로그래머스 - 문자열 압축 (0) | 2023.01.09 |