백준 직육면체 교집합

KIMYEONGJUN·2026년 4월 22일
post-thumbnail

문제

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

첫째 줄에 직육면체의 개수 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄부터 N개의 줄에는 직육면체의 한 꼭짓점 좌표 (x1, y1, z1)과 반대편 꼭짓점 좌표 (x2, y2, z2)가 주어진다. (1 ≤ x1, y1, z1, x2, y2, z2 ≤ 1,000, x1 < x2, y1 < y2, z1 < z2)

첫째 줄에 직육면체 N개의 교집합의 부피를 출력한다.

내가 이 문제를 보고 생각해본 부분

입력받은 N에 따라 N개의 직육면체 좌표를 읽는다.
maxX1, maxY1, maxZ1 변수들은 직육면체 모두가 겹치는 부분의 시작점(최대값)을 저장한다.
minX2, minY2, minZ2 변수들은 겹치는 부분의 끝점(최소값)을 저장한다.
겹치는 영역의 길이는 각 축에서 minEnd - maxStart로 계산한다.
만약 하나라도 음수이거나 0인 경우, 교집합이 없으므로 부피는 0이다.
그렇지 않으면 겹치는 직육면체의 부피를 출력한다.

코드로 구현

package baekjoon.baekjoon_34;

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

// 백준 11665번 문제
public class Main1368 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        int maxX1 = Integer.MIN_VALUE;
        int maxY1 = Integer.MIN_VALUE;
        int maxZ1 = Integer.MIN_VALUE;

        int minX2 = Integer.MAX_VALUE;
        int minY2 = Integer.MAX_VALUE;
        int minZ2 = Integer.MAX_VALUE;

        for(int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x1 = Integer.parseInt(st.nextToken());
            int y1 = Integer.parseInt(st.nextToken());
            int z1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            int y2 = Integer.parseInt(st.nextToken());
            int z2 = Integer.parseInt(st.nextToken());

            // 겹치는 영역을 찾기 위해 최대 시작점과 최소 끝점 저장
            if (x1 > maxX1) maxX1 = x1;
            if (y1 > maxY1) maxY1 = y1;
            if (z1 > maxZ1) maxZ1 = z1;

            if (x2 < minX2) minX2 = x2;
            if (y2 < minY2) minY2 = y2;
            if (z2 < minZ2) minZ2 = z2;
        }

        // 각 축 겹치는 길이 계산 (0보다 작으면 겹치는 영역 없음)
        int overlapX = minX2 - maxX1;
        int overlapY = minY2 - maxY1;
        int overlapZ = minZ2 - maxZ1;

        int volume = 0;
        if (overlapX > 0 && overlapY > 0 && overlapZ > 0) {
            volume = overlapX * overlapY * overlapZ;
        }

        System.out.println(volume);
        br.close();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글