백준 게시판

KIMYEONGJUN·2026년 4월 14일
post-thumbnail

문제

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

입력의 첫 줄에는 테스트 케이스의 개수 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();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글