백준 Pole

KIMYEONGJUN·2026년 4월 28일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글