백준 종이자르기

KIMYEONGJUN·2025년 3월 21일
0
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개의 댓글

관련 채용 정보