
내가 생각했을때 문제에서 원하는부분
W pierwszym wierszu wejścia znajdują się 4 liczby całkowite: x1, y1, x2, y2, oznaczające odpowiednio współrzędną x - ową i y - ową lewego górnego rogu i współrzędną x - ową i y - ową prawego dolnego rogu pierwszego prostokąta.
W drugim wierszu wejścia znajdują się 4 liczby całkowite: x3, y3, x4, y4, oznaczające odpowiednio współrzędną x - ową i y - ową lewego górnego rogu i współrzędną x - ową i y - ową prawego dolnego rogu drugiego prostokąta.
Wszystkie współrzędne są nie mniejsze niż 0 i nie większe niż 1000000.
Pierwszym i jedyny wiersz wyjścia powinien zawierać jedną liczę całkowitą równą wartości pola części wspólnej dwóch prostokątów.
내가 이 문제를 보고 생각해본 부분
Point 클래스
2차원 평면 위 한 점의 좌표 (x,y)를 저장한다.
생성자로 x,y 값을 받아 저장한다.
Rect 클래스
하나의 직사각형을 표현한다.
topLeft(왼쪽 위 점)와 bottomRight(오른쪽 아래 점)의 두 Point 좌표를 저장한다.
main 메서드
표준 입력으로 두 직사각형의 좌표를 읽어온다.
첫 줄: 첫 번째 직사각형 네 좌표 (x1,y1,x2,y2)
둘째 줄: 두 번째 직사각형 네 좌표 (x3,y3,x4,y4)
Rect 객체 두 개를 생성한다.
가로 겹침 길이를 calculateOverlap 메서드에 넘겨 계산한다.
각 직사각형의 왼쪽과 오른쪽 x 좌표를 Point로 전달해 겹치는 구간 길이를 구한다.
세로 겹침 길이도 같은 방식으로 구한다.
두 겹침 길이를 곱해 겹치는 넓이를 출력한다.
calculateOverlap 메서드
두 개의 Point를 받아, 각각 수직선(또는 수평선)의 시작과 끝 좌표 범위를 나타낸다.
0부터 1,000,000까지 인덱스가 있는 boolean 배열을 생성한다.
첫 번째 구간에 해당하는 인덱스들은 true로 표시한다.
두 번째 구간 중 true로 표시된 부분이 있으면, 즉 겹치는 부분의 길이만큼 카운트한다.
이 길이(length)를 반환한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 8716번 문제
public class Main1373 {
private static class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
private static class Rect {
Point topLeft;
Point bottomRight;
Rect(Point topLeft, Point bottomRight) {
this.topLeft = topLeft;
this.bottomRight = bottomRight;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Rect rect1 = new Rect(
new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())),
new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))
);
st = new StringTokenizer(br.readLine());
Rect rect2 = new Rect(
new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())),
new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))
);
long overlapWidth = calculateOverlap(new Point(rect1.topLeft.x, rect1.bottomRight.x),
new Point(rect2.topLeft.x, rect2.bottomRight.x));
long overlapHeight = calculateOverlap(new Point(rect1.topLeft.y, rect1.bottomRight.y),
new Point(rect2.topLeft.y, rect2.bottomRight.y));
System.out.println(overlapWidth * overlapHeight);
br.close();
}
private static long calculateOverlap(Point range1, Point range2) {
boolean[] coverage = new boolean[1_000_001];
long length = 0;
int start1 = Math.min(range1.x, range1.y);
int end1 = Math.max(range1.x, range1.y);
for (int i = start1; i < end1; i++) {
coverage[i] = true;
}
int start2 = Math.min(range2.x, range2.y);
int end2 = Math.max(range2.x, range2.y);
for (int i = start2; i < end2; i++) {
if (coverage[i]) length++;
}
return length;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.