코딩테스트/구현(Implementation)

[Java] 백준 2669번 : 직사각형 네개의 합집합의 면적 구하기

sujin7837 2022. 2. 26. 17:05
반응형

문제

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭짓점이 겹칠 수도 있다.

이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오.

입력

입력은 네 줄이며, 각 줄은 직사각형의 위치를 나타내는 네 개의 정수로 주어진다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭짓점의 x좌표, y좌표이고 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭짓점의 x좌표, y좌표이다. 모든 x좌표와 y좌표는 1이상이고 100이하인 정수이다.

출력

첫 줄에 네개의 직사각형이 차지하는 면적을 출력한다.

예제 입력 1

1 2 4 4
2 3 5 7
3 1 6 5
7 3 8 6

예제 출력 1

26

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	private static BufferedReader bf;
	private static StringTokenizer st;
	
	private static int sX, sY, eX, eY;
	private static int [][] map;

	static class Rectangle {
		int startX, startY, endX, endY;

		public Rectangle(int startX, int startY, int endX, int endY) {
			super();
			this.startX = startX;
			this.startY = startY;
			this.endX = endX;
			this.endY = endY;
		}

		@Override
		public String toString() {
			return "Rectangle [startX=" + startX + ", startY=" + startY + ", endX=" + endX + ", endY=" + endY + "]";
		}

	}

	public static void main(String[] args) throws IOException {
		Rectangle [] rectangle=new Rectangle[4];
		bf=new BufferedReader(new InputStreamReader(System.in));
		int maxVal=0;
		for(int i=0;i<4;i++) {
			st=new StringTokenizer(bf.readLine());
			sX=Integer.parseInt(st.nextToken());
			sY=Integer.parseInt(st.nextToken());
			eX=Integer.parseInt(st.nextToken());
			eY=Integer.parseInt(st.nextToken());
			maxVal=Math.max(maxVal, eX);
			maxVal=Math.max(maxVal, eY);
			rectangle[i]=new Rectangle(sX, sY, eX, eY);
		}
		
		map=new int[maxVal][maxVal];
		for(int i=0;i<4;i++) {
			for(int r=rectangle[i].startX;r<rectangle[i].endX;r++) {
				for(int c=rectangle[i].startY;c<rectangle[i].endY;c++) {
					map[r][c]=1;
				}
			}
		}
		
		int result=0;
		for(int r=0;r<maxVal;r++) {
			for(int c=0;c<maxVal;c++) {
				if(map[r][c]==1) result++;
			}
		}
		
		System.out.println(result);
	}

}
반응형