728x90
https://www.acmicpc.net/problem/2583
1) 사각형 부분은 1로 세팅한다.
2) 포문을 돌면서 0인 곳에서 count를 초기화하고 dfs를 한다! 이때, count는 넓이 계산에 사용된다.
3) dfs를 돌면서 count+1를 한다.
4) arrlist에 count를 넣는다.
5) arrlist의 개수는 영역의 개수가 되고, 값은 영역의 넓이가 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int[][] arr;
static int m, n, k,count;
static int[] dx = { 1, -1, 0, 0 };
static int[] dy = { 0, 0, 1, -1 };
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new int[m][n];
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
int lx = Integer.parseInt(st.nextToken());
int ly = Integer.parseInt(st.nextToken());
int rx = Integer.parseInt(st.nextToken());
int ry = Integer.parseInt(st.nextToken());
for (int j = ly; j <ry; j++) {
for (int z = lx; z <rx; z++) {
arr[j][z] = 1;
}
}
}
ArrayList<Integer> arrlist = new ArrayList<>();
for (int j = 0; j < m; j++) {
for (int z = 0; z < n; z++) {
if(arr[j][z]==0) {
count=0;
find(j,z);
arrlist.add(count);
}
}
}
Collections.sort(arrlist);
StringBuilder sb = new StringBuilder();
sb.append(arrlist.size()).append("\n");
for(int i:arrlist) {
sb.append(i).append(" ");
}
System.out.println(sb);
}
static void find(int x, int y) {
arr[x][y]=1;
count++;
for(int i=0;i<4;i++) {
int xx = x+dx[i];
int yy=y+dy[i];
if(xx>=0&&yy>=0&&xx<m&&yy<n) {
if(arr[xx][yy]==0) {
find(xx,yy);
}
}
}
}
}
'Java' 카테고리의 다른 글
[백준 2485] 가로수 (JAVA) (0) | 2023.03.23 |
---|---|
[백준 2206] 벽 부수고 이동하기 (JAVA) (0) | 2023.03.23 |
[백준 13305] 주유소 (JAVA) (0) | 2023.03.22 |
[백준 20438] 출석체크 (JAVA) (0) | 2023.03.22 |
[백준 14889] 스타트와 링크 (JAVA) (0) | 2023.03.20 |