본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/01 기초,재귀,완전탐색, 정렬

[기초-구현] 백준 2628번 종이자르기 with Python3

by 금의야행 2021. 8. 8.

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

 

2628번: 종이자르기

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

www.acmicpc.net

문제

 

내 풀이

length = list(map(int, input().split()))
cutno = int(input())

hor = int(length[0])
ver = int(length[1])

horcord = []
vercord = []
for i in range(hor):
    horcord.append('*')
for i in range(ver):
    vercord.append('*')

counthor = 0
countver = 0

cuthor = []
cutver = []
for _ in range(cutno):
    Cut = list(map(int, input().split()))
    if Cut[0] == 1:
        cuthor.append(int(Cut[1]))
    else:
        cutver.append(int(Cut[1]))

cuthor.sort()
cutver.sort()

for i in range(len(cuthor)):
    index = int(cuthor[i]) + counthor
    horcord.insert(index, 'X')
    counthor += 1

for i in range(len(cutver)):
    index = int(cutver[i]) + countver
    vercord.insert(index, 'X')
    countver += 1


horstr = ''.join([str(elem) for elem in horcord])
verstr = ''.join([str(elem) for elem in vercord])

horlist = horstr.split('X')
verlist = verstr.split('X')

a = int(len(max(horlist, key=len)))*int(len(max(verlist, key=len)))
print(a)

해설

각 변을 list로 표현했다. 처음엔 숫자를 넣었는데 str화 시키는 과정에서 10, 100 부터 추가적인 자리를 가져가 문제가 생겼었다. 

그리고 잘라야하는 위치를 X로 표현했다.

구현에 여러 트러블들이 있었다...

 

 

 

정답 풀이

x, y = map(int, input().split())
x_list = [0, x] #가로 각각 길이
y_list = [0, y] #세로 각각 길이
for _ in range(int(input())):
    xy, length = map(int, input().split())
    if xy == 0:
        y_list.append(length)
    else:
        x_list.append(length)
        
x_list.sort() #좌, 위쪽부터 꺼내서 대조 하기 위함
y_list.sort()

max_square = 0
for i in range(1, len(x_list)):
    for j in range(1, len(y_list)):
        width = x_list[i] - x_list[i-1]
        height = y_list[j] - y_list[j-1]
        max_square = max(max_square, width * height) #가장 큰 범위

print(max_square)

출처:https://claude-u.tistory.com/451

 

해석

왜 남이 한 코드들은 이렇게 쉬워보일까.

댓글