공부하기/백준

[Python] 백준 풀기 2628 - 종이자르기

XEV 2023. 1. 18. 21:51

파이썬 백준 2628번

실버 5

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

 

2628번: 종이자르기

아래 <그림 1>과 같이 직사각형 모양의 종이가 있다. 이 종이는 가로방향과 세로 방향으로 1㎝마다 점선이 그어져 있다. 가로 점선은 위에서 아래로 1번부터 차례로 번호가 붙어 있고, 세로 점선

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 정렬

 

 

 

 

 

문제 풀기

종이 세로의 처음과 끝, 종이 가로의 처음과 끝 그리고 잘라야 하는 주어진 위치를 2차원 리스트 cutting_ls 에 모두 입력 받는다.

2차원 리스트를 모두 오름차순으로 정렬을 하여 세로 요소를 순차적으로 그 다음 가로 요소를 순차적으로 한 쌍씩 빼내어 그 차이를 각각 나누어 저장한다.

height_ls 와 width_ls 에 저장된 잘린 길이의 차이값 중 각각 최대값을 빼내어 곱으로 그 넓이를 출력한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline


def fnCutPaper(w, h):
    cutting_ls.sort(key = lambda x :( x[0], x[1]))
    print(f'cutting_ls sorted: {cutting_ls}') # TEST PRINT
    
    height_ls = []
    width_ls = []
    for i in range(1, len(cutting_ls)):
        if cutting_ls[i][0] == 0:
            h_diff = cutting_ls[i][1] - cutting_ls[i - 1][1]
            height_ls.append(h_diff)
        elif cutting_ls[i][0] == 1:
            w_diff = cutting_ls[i][1] - cutting_ls[i - 1][1]
            width_ls.append(w_diff)
    print(f'height_ls: {height_ls}') # TEST PRINT
    print(f'width_ls: {width_ls}') # TEST PRINT
    
    print(max(height_ls) * max(width_ls))


if __name__ == "__main__":
    w, h = map(int, inputdata().split())
    n = int(inputdata().strip())
    
    cutting_ls = [[0, 0], [0, h], [1, 0], [1, w]]
    
    for _ in range(n):
        cutting_ls.append(list(map(int, inputdata().split())))
    print(f'cutting_ls default: {cutting_ls}') # TEST PRINT
    
    fnCutPaper(w, h)


'''
10 8
3
0 3
1 4
0 2

cutting_ls default: [[0, 0], [0, 8], [1, 0], [1, 10], [0, 3], [1, 4], [0, 2]]
cutting_ls sorted: [[0, 0], [0, 2], [0, 3], [0, 8], [1, 0], [1, 4], [1, 10]]
height_ls: [2, 1, 5]
width_ls: [-8, 4, 6]

30
'''