백준 2304 창고 다각형 (파이썬)

shon4bw·2021년 8월 24일
0

🧐1일 1알

목록 보기
14/24
post-thumbnail

내 코드

# 창고 면적이 가장 작은 창고를 만들고 싶대
# 오목한 부분이 없어야 한대 -> 내려갔다가 다시 올라오면 안되겠네
# 최댓값의 왼쪽, 오른쪽 둘 다 오름차순

N = int(input())  # 기둥의 개수 (1<= N <= 1000)
LH_list = []
for _ in range(N):
    LH = list(map(int, input().split()))  # 왼쪽면의 위치, 높이
    LH_list.append(LH)
# print(LH_list)  -> [[2, 4], [11, 4], [15, 8], [4, 6], [5, 3], [8, 10], [13, 6]]

# 왼쪽면의 위치로 오름차순 만들어주고
sorted_LH = LH_list.sort()
# print(LH_list) # -> [[2, 4], [4, 6], [5, 3], [8, 10], [11, 4], [13, 6], [15, 8]]
# sorted_LH는 none출력, L_list가 정렬된 걸 출력!

# 왼쪽면의 최댓값 찾고
# 그 왼쪽, 오른쪽 구역 나눠서 살펴줘

max_left = 0
for i in range(len(LH_list)):  # 7
    if LH_list[i][1] > max_left:
        max_left = LH_list[i][1]  # 10
        max_position = i  # 3

sum_land = LH_list[max_position][1]

# 왼쪽 - 이 안에서 내 왼쪽이 나보다 높으면 나 무시해줘
for j in range(max_position):  # 0 1 2
    if LH_list[j][1] <= LH_list[j + 1][1]:
        land = (LH_list[j + 1][0] - LH_list[j][0]) * LH_list[j][1]
        sum_land += land
    else:
        LH_list[j + 1][1] = LH_list[j][1] 
        land = (LH_list[j + 1][0] - LH_list[j][0]) * LH_list[j][1]
        sum_land += land

# 오른쪽 - 이 안에서 내 오른쪽이 나보다 높으면 나 무시해줘
for z in range(N-1, max_position, -1): # 6 5 4
    if LH_list[z][1] <= LH_list[z - 1][1]:
        land = (LH_list[z][0] - LH_list[z-1][0]) * LH_list[z][1]
        sum_land += land
    else:
        LH_list[z - 1][1] = LH_list[z][1] 
        land = (LH_list[z][0] - LH_list[z-1][0]) * LH_list[z][1]
        sum_land += land
print(sum_land)

포인트

특별히 어려운 코드는 아닌데 인덱스로 세심하게 짜야하는? 전형적인 IM스러운 문제인 것 같다. (= 나의 취약점)
큰 틀은 최댓값을 구해주고 그 왼쪽, 오른쪽을 나눠서 생각하는 것!
L과 H를 동시에 사용해야 하기 때문에 처음에 딕셔너리로 받았는데 엄청 헤맸다..!
결국엔 이중 리스트로 받아서 인덱스로 다가가는 걸로!
list의 mutable한 속성을 잠시 까먹어서 sorted_LH를 쓸 뻔했지만!
다행히 빨리 알아차렸다!

profile
cut_the_mustard

0개의 댓글