Java

[백준 2583] 영역 구하기 (JAVA)

iheeeee6-6 2023. 3. 23. 01:22
728x90

https://www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

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