
내가 생각했을때 문제에서 원하는부분
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄에 8개의 정수 x1, y1, x2, y2, x3, y3, x4, y4가 주어진다.
상원이 처음 붙인 포스터의 두 꼭짓점의 좌표 (x1, y1), (x2, y2)와 그 위에 덧붙은 포스터의 꼭짓점의 좌표 (x3, y3), (x4, y4) 이다.
1 ≤ x1 < x2 ≤ 10,000; 1 ≤ y1 < y2 ≤ 10,000; 1 ≤ x3 < x4 ≤ 10,000; 1 ≤ y3 < y4 ≤ 10,000의 범위를 가진다.
각 테스트 케이스에 대해서 보이는 부분의 넓이를 한 줄에 하나씩 출력한다.
내가 이 문제를 보고 생각해본 부분
먼저 BufferedReader와 StringTokenizer를 통해 입력을 빠르게 받아온다.
첫 줄에서 T를 읽어 테스트 케이스 개수를 저장한다.
각 테스트 케이스마다 좌표 8개를 입력는다.
첫 번째 포스터 면적을 계산한다.
두 포스터가 겹치는 가로 부분은 min(x2, x4) 와 max(x1, x3) 를 비교해 겹치는 폭을 구하고, 0보다 작으면 겹치지 않는 것이므로 0으로 만든다.
세로 부분도 같은 방식으로 겹치는 높이를 구한다.
겹치는 면적은 겹치는 폭과 높이의 곱이다.
마지막으로 첫 번째 포스터 면적에서 겹치는 면적을 빼서 보이는 면적을 구해 출력한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 3063번 문제
public class Main1358 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // 테스트 케이스 수
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int x3 = Integer.parseInt(st.nextToken());
int y3 = Integer.parseInt(st.nextToken());
int x4 = Integer.parseInt(st.nextToken());
int y4 = Integer.parseInt(st.nextToken());
int area1 = (x2 - x1) * (y2 - y1);
int overlapWidth = Math.max(0, Math.min(x2, x4) - Math.max(x1, x3));
int overlapHeight = Math.max(0, Math.min(y2, y4) - Math.max(y1, y3));
int overlapArea = overlapWidth * overlapHeight;
int visibleArea = area1 - overlapArea;
System.out.println(visibleArea);
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.