백준 2628 종이자르기 JAVA 풀이 (구현, 정렬, 시간복잡도)

2026. 4. 13. 12:10·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

https://www.acmicpc.net/problem/2628


📌 문제 개요

가로 M, 세로 N 크기의 종이를 여러 번 자른다.
각 자르기는 가로(0) 또는 세로(1) 방향으로 이루어진다.

 

모든 자르기가 끝난 후

가장 큰 직사각형 조각의 넓이를 구하는 문제이다.


📌 접근 방법

  • 가로로 자르면 → 세로 길이가 나뉨
  • 세로로 자르면 → 가로 길이가 나뉨

따라서

  • 가로선 리스트 (세로 분할)
  • 세로선 리스트 (가로 분할)

이렇게 2개로 분리해서 관리한다.

그리고

  • 시작점(0)
  • 끝점(전체 길이)

을 반드시 포함해야 한다.


📌 핵심 아이디어

  • 자른 위치들을 정렬
  • 인접한 값끼리 차이를 구하면 조각 길이 생성

예 : 0, 2, 3, 8 → 길이: 2, 1, 5

 
가장 큰 길이만 필요

 

최종 결과 : 최대 가로 길이 × 최대 세로 길이

 

📌 전체 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        int width = Integer.parseInt(st.nextToken());   // 가로
        int height = Integer.parseInt(st.nextToken());  // 세로
        
        int N = Integer.parseInt(br.readLine());

        ArrayList<Integer> row = new ArrayList<>(); // 가로 자르기 (세로 길이)
        ArrayList<Integer> col = new ArrayList<>(); // 세로 자르기 (가로 길이)

        // 시작점, 끝점 추가
        row.add(0);
        row.add(height);
        col.add(0);
        col.add(width);

        for(int i = 0; i < N; i++){
            StringTokenizer st1 = new StringTokenizer(br.readLine());
            int type = Integer.parseInt(st1.nextToken());
            int pos = Integer.parseInt(st1.nextToken());

            if(type == 0){
                row.add(pos);
            } else {
                col.add(pos);
            }
        }

        Collections.sort(row);
        Collections.sort(col);

        int maxHeight = 0;
        int maxWidth = 0;

        // 세로 조각 최대
        for(int i = 1; i < row.size(); i++){
            maxHeight = Math.max(maxHeight, row.get(i) - row.get(i - 1));
        }

        // 가로 조각 최대
        for(int i = 1; i < col.size(); i++){
            maxWidth = Math.max(maxWidth, col.get(i) - col.get(i - 1));
        }

        System.out.println(maxWidth * maxHeight);
    }
}

📄 정리

  • 핵심은 “자른 위치”가 아니라 “구간 길이”
  • 정렬 후 인접 차이 계산이 핵심
  • 구현 문제지만 아이디어가 중요
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

백준 9237 이장님 초대 JAVA 풀이 (그리디, 정렬, 시간복잡도)  (0) 2026.04.15
백준 16395 파스칼의 삼각형 JAVA 풀이 (DP, 조합)  (0) 2026.04.14
백준 10431 줄세우기 JAVA 풀이 (구현, 정렬, 시간복잡도)  (0) 2026.04.12
[백준] 11576번 : Base Conversion (JAVA)  (0) 2026.04.12
백준 15688 수 정렬하기 5 JAVA 풀이 (정렬, 시간복잡도)  (0) 2026.04.09
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 백준 9237 이장님 초대 JAVA 풀이 (그리디, 정렬, 시간복잡도)
  • 백준 16395 파스칼의 삼각형 JAVA 풀이 (DP, 조합)
  • 백준 10431 줄세우기 JAVA 풀이 (구현, 정렬, 시간복잡도)
  • [백준] 11576번 : Base Conversion (JAVA)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    정렬
    백준
    정보처리기사
    기출문제
    정처기
    springboot
    solved.ac
    백엔드개발자
    구현
    알고리즘
    실기
    시뮬레이션
    dp
    정처기실기
    정처기오답노트
    java
    브루트포스
    Level2
    코딩테스트
    level1
    자바
    배열
    문자열
    수학
    피보나치
    level0
    정보처리기사 실기 기출문제
    프로그래머스
    자료구조
    완전탐색
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
백준 2628 종이자르기 JAVA 풀이 (구현, 정렬, 시간복잡도)
상단으로

티스토리툴바