코딩테스트/백준

[Java] 백준 2538 : 영역 구하기

플래시🦥 2023. 2. 16.
반응형
https://www.acmicpc.net/problem/2583
 

2583번: 영역 구하기

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

www.acmicpc.net


주어진 배열을 왼쪽 위 상단이 0,0이 되도록 바꾸어 주었다. 

안 바꿔주고 그냥 계산해서 해도 정답은 나오지만 그냥 내가 문제를 파악하기 편하도록 바꿨다. 

static void fillArr(int sx,int sy,int ex,int ey) {
		//좌표변환 (sx,sy,ex,ey)-> (M-sy,sx,M-ey,ex)
		int startY=sx;
		int startX=M-sy;
		int endY=ex;
		int endX=M-ey;
			
		for(int i=endX;i<startX;i++) {
			for(int j=startY;j<endY;j++) {
				arr[i][j]=1;
			}
		}
	}//fillArr()

 

바꾸어 준다음에 배열을 이동하면서 비어있는 영역을 파악하기만 하면 된다. 


import java.util.*;

public class Main {

	static int N,M,K,cnt,val;
	static int[][] arr;
	static int[] dx= {0,0,-1,1};
	static int[] dy= {-1,1,0,0};
	 private static List<Integer> areas = new ArrayList<>();
	
	public static void main(String[] args){
	
		Scanner sc= new Scanner(System.in);
		M =sc.nextInt();
		N =sc.nextInt();
		K =sc.nextInt();
		arr= new int[M][N];
		
		for(int i=0;i<K;i++) {
			int sx=sc.nextInt();
			int sy=sc.nextInt();
			int ex=sc.nextInt();
			int ey=sc.nextInt();
			fillArr(sx,sy,ex,ey);		
		}

		for(int i=0;i<M;i++) {
			for(int j=0;j<N;j++) {
				if(arr[i][j]==0) {
					cnt ++;
					val=0;
					dfs(i,j);
					areas.add(val);
				}
			}
		}
		Collections.sort(areas);
		System.out.println(cnt);
		for(int a :areas)
			System.out.print(a+" ");
	
	}// main()
	
	static void fillArr(int sx,int sy,int ex,int ey) {
		//좌표변환 (sx,sy,ex,ey)-> (M-sy,sx,M-ey,ex)
		int startY=sx;
		int startX=M-sy;
		int endY=ex;
		int endX=M-ey;
			
		for(int i=endX;i<startX;i++) {
			for(int j=startY;j<endY;j++) {
				arr[i][j]=1;
			}
		}
	}//fillArr()
	
	static void dfs(int x, int y) {
		
		arr[x][y]=1;
		val++;
		
		for(int i=0;i<4;i++) {
			int nx = x+dx[i];
			int ny = y+dy[i];
			
			if(nx>=0&&ny>=0&&nx<M&&ny<N) {
				if(arr[nx][ny]==0) {
					dfs(nx,ny);	
				}
			}
			
		}
				
	}//dfs()
	
}// class Main
728x90
반응형

댓글