파이썬 백준 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 '''
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 25304 - 영수증 (0) | 2023.01.20 |
---|---|
[Python] 백준 풀기 2635 - 수 이어가기 (0) | 2023.01.19 |
[Java] 백준 풀기 1158 - 요세푸스 문제 (0) | 2023.01.17 |
[Java] 백준 풀기 17478 - 재귀함수가 뭔가요? (0) | 2023.01.16 |
[Java] 백준 풀기 2742 - 기찍 N (0) | 2023.01.15 |