내 코드
# 창고 면적이 가장 작은 창고를 만들고 싶대
# 오목한 부분이 없어야 한대 -> 내려갔다가 다시 올라오면 안되겠네
# 최댓값의 왼쪽, 오른쪽 둘 다 오름차순
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
를 쓸 뻔했지만!
다행히 빨리 알아차렸다!