문제 출처: https://www.acmicpc.net/problem/1926
문제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
private static int[][] directions = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 }, };
private static int n, m;
private static int[][] art;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
n = Integer.parseInt(tokenizer.nextToken()); // 세로(행)
m = Integer.parseInt(tokenizer.nextToken()); // 가로(열)
art = new int[n][m];
boolean[][] visited = new boolean[n][m];
int cnt = 0; // 그림의 개수
int res = 0; // 최댓값
for (int i = 0; i < n; i++) {
tokenizer = new StringTokenizer(reader.readLine());
for (int j = 0; j < m; j++) {
art[i][j] = Integer.parseInt(tokenizer.nextToken());
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (art[i][j] == 1 && !visited[i][j]) {
res = Math.max(res, bfs(visited, i, j));
cnt++;
}
}
}
System.out.println(cnt + "\n" + res);
}
private static int bfs(boolean[][] visited, int y, int x) {
Queue<int[]> queue = new ArrayDeque<>();
queue.offer(new int[] { y, x });
int cnt = 0;
while (!queue.isEmpty()) {
int[] curr = queue.poll();
int r = curr[0];
int c = curr[1];
if (visited[r][c]) continue;
visited[r][c] = true;
cnt++;
for (int i = 0; i < 4; i++) {
int dy = r + directions[i][0];
int dx = c + directions[i][1];
if (dy >= 0 && dy < n && dx >= 0 && dx < m) {
if (art[dy][dx] == 1 && !visited[dy][dx]) queue.offer(new int[] { dy, dx });
}
}
}
return cnt;
}
}