알고리즘/정렬

[백준알고리즘] 정렬 - 2628번 종이자르기 문제

Fenderblue 2023. 5. 12. 00:12

첫번째 제출에서 틀렸었는데,

가로로는 자르지 않거나 세로로는 자르지 않았을 경우를 생각해놓지 않아서 90퍼쯤에서 런타임에러가 떴었다.

sort함수를 써서 정렬을 하긴 했는데 정렬 문제를 이렇게 풀어도 되나(?) -> ㄱㅊ

사실 풀때 첨엔 좀 막막했었다. 뭔가 쉬워보이는데 바로 쉽게 풀리진 않았던 문제..

가로로 잘랐을때 생기는 각 높이들, 세로로 잘랐을때 생가는 각 가로길이들을 구하고

(이것들을 모두 조합하면 잘랐을때 생기는 모든 사각형들이게 되므로)

각각 내림차순으로 정렬해서 가장 앞에 있는 값을 각각 구해(가장 큰 값) 그 두개를 곱해서 답을 구했다.

 

 

풀이코드

package baekjoonWeek5;

import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class BJ_2628 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int width = Integer.parseInt(st.nextToken());
        int height = Integer.parseInt(st.nextToken());
        int cut = Integer.parseInt(br.readLine());  //자르는 횟수
        ArrayList<Integer> widths = new ArrayList<>();
        ArrayList<Integer> heights = new ArrayList<>();
        ArrayList<Integer> xcuts = new ArrayList<>();
        ArrayList<Integer> ycuts = new ArrayList<>();

        for (int i = 0; i < cut; i++) {
            st = new StringTokenizer(br.readLine());
            int xOrY = Integer.parseInt(st.nextToken());
            int tmp = Integer.parseInt(st.nextToken());
            if (xOrY == 0) {
                xcuts.add(tmp);
            } else {
                ycuts.add(tmp);
            }
        }
        Collections.sort(xcuts);
        Collections.sort(ycuts);

        int xStart = 0; int yStart = 0;
        int tmp;
        for (int i = 0; i < xcuts.size(); i++) {
            tmp = xcuts.get(i);
            heights.add(tmp - xStart);
            xStart = tmp;
        }
        for (int i = 0; i < ycuts.size(); i++) {
            tmp = ycuts.get(i);
            widths.add(tmp - yStart);
            yStart = tmp;
        }

        //가로로는 자르지 않거나 세로로는 자르지 않거나 아예 자르지 않는 경우도 고려하자
        if (xStart == 0 || xStart != height) {
            heights.add(height - xStart);   //마지막 높이도 넣어준다
        }
        if (yStart == 0 || yStart != width) {
            widths.add(width - yStart);
        }
        Collections.sort(widths, Collections.reverseOrder());   //내림차순 정렬
        Collections.sort(heights, Collections.reverseOrder());
        
        bw.write(Integer.toString(widths.get(0) * heights.get(0)));
        bw.flush();
        bw.close();

    }



}