import java.util.*;
class Solution {
int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
boolean[][] visited;
int m, n;
int[][] picture;
public int[] solution(int m, int n, int[][] picture) {
this.m = m;
this.n = n;
this.picture = picture;
visited = new boolean[m][n];
int areas = 0;
int maxSize = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(!visited[i][j] && picture[i][j] != 0) {
areas++;
maxSize = Math.max(maxSize, bfs(i, j, picture[i][j]));
}
}
}
int[] answer = new int[2];
answer[0] = areas;
answer[1] = maxSize;
return answer;
}
int bfs(int x, int y, int color) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(x, y));
int sizeOfArea = 0;
visited[x][y] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
sizeOfArea++;
for(int[] dir : direction) {
int nx = point.x + dir[0];
int ny = point.y + dir[1];
if(nx >= 0 && nx < m && ny >= 0 && ny < n) {
if(picture[nx][ny] == color && !visited[nx][ny]) {
visited[nx][ny] = true;
queue.add(new Point(nx, ny));
}
}
}
}
return sizeOfArea;
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}