백준 종이자르기

KIMYEONGJUN·2025년 3월 21일
post-thumbnail

문제

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

첫줄에는 종이의 가로와 세로의 길이가 차례로 자연수로 주어진다.
가로와 세로의 길이는 최대 100㎝이다.
둘째 줄에는 칼로 잘라야하는 점선의 개수가 주어진다.
셋째 줄부터 마지막 줄까지 한 줄에 점선이 하나씩 아래와 같은 방법으로 입력된다.
가로로 자르는 점선은 0과 점선 번호가 차례로 주어지고, 세로로 자르는 점선은 1과 점선 번호가 주어진다.
입력되는 두 숫자 사이에는 빈 칸이 하나씩 있다.

첫째 줄에 가장 큰 종이 조각의 넓이를 출력한다.
단, 넓이의 단위는 출력하지 않는다.

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

입력 처리: BufferedReader를 사용하여 입력을 받는다.
점선 저장: 가로와 세로 점선을 각각 리스트에 저장한다.
정렬: 각 리스트를 정렬하여 점선의 위치를 순서대로 확인한단.
최대 조각 크기 계산:
가로 조각의 최대 높이를 계산한다.
세로 조각의 최대 너비를 계산한다.
결과 출력: 최종적으로 최대 넓이를 계산하여 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

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

        // 종이의 가로와 세로 길이 입력
        String[] dimensions = br.readLine().split(" ");
        int width = Integer.parseInt(dimensions[0]);
        int height = Integer.parseInt(dimensions[1]);

        // 자르는 점선의 개수 입력
        int cutsCount = Integer.parseInt(br.readLine());

        // 가로 및 세로 점선을 저장할 리스트
        ArrayList<Integer> horizontalCuts = new ArrayList<>();
        ArrayList<Integer> verticalCuts = new ArrayList<>();

        // 점선 입력
        for(int i = 0; i < cutsCount; i++) {
            String[] cut = br.readLine().split(" ");
            int type = Integer.parseInt(cut[0]);
            int position = Integer.parseInt(cut[1]);

            if(type == 0) {
                horizontalCuts.add(position);
            } else {
                verticalCuts.add(position);
            }
        }

        // 점선 정렬
        Collections.sort(horizontalCuts);
        Collections.sort(verticalCuts);

        // 최대 조각의 세로 길이 계산
        int maxHeight = 0;
        int lastCut = 0;

        for(int cut : horizontalCuts) {
            maxHeight = Math.max(maxHeight, cut - lastCut);
            lastCut = cut;
        }
        maxHeight = Math.max(maxHeight, height - lastCut); // 마지막 조각

        // 최대 조각의 가로 길이 계산
        int maxWidth = 0;
        lastCut = 0;

        for(int cut : verticalCuts) {
            maxWidth = Math.max(maxWidth, cut - lastCut);
            lastCut = cut;
        }
        maxWidth = Math.max(maxWidth, width - lastCut); // 마지막 조각

        // 최종 결과 출력
        int maxArea = maxHeight * maxWidth;
        sb.append(maxArea).append("\n");
        System.out.print(sb.toString());
        br.close();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글