[BFS / DFS] [백준 / 2583 ] 실버1 - 영역 구하기 (java/자바)

package BFS_DFS;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class boj_2583 {
static int M, N, K;
static int[][] matrix;
static boolean[][] isVisited;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
static int area;
public static void main(String[] args) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(r.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
matrix = new int[M][N];
isVisited = new boolean[M][N];
for (int i = 0; i < K; i++) {
st = new StringTokenizer(r.readLine());
int startX = Integer.parseInt(st.nextToken());
int startY = Integer.parseInt(st.nextToken());
int endX = Integer.parseInt(st.nextToken());
int endY = Integer.parseInt(st.nextToken());
for (int y = startY; y < endY; y++) {
for (int x = startX; x < endX; x++) {
matrix[y][x] = 1;
}
}
}
List<Integer> areas = new ArrayList<>();
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (matrix[i][j] == 0 && !isVisited[i][j]) {
area = 0;
dfs(i, j);
areas.add(area);
}
}
}
Collections.sort(areas);
System.out.println(areas.size());
for (int size : areas) {
System.out.print(size + " ");
}
}
static void dfs(int y, int x) {
isVisited[y][x] = true;
area++;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < M) {
if (matrix[ny][nx] == 0 && !isVisited[ny][nx]) {
dfs(ny, nx);
}
}
}
}
}

시작점(0,0)이 맨 왼쪽아래다. 초기화할 때 주의해야한다.
이 부분만 주의하면 쉬운 문제가 된다.