풀이 1.
극소점부터 큰값이 나올때마다 그만큼 채워주면서 연산.
import sys
input = sys.stdin.readline
n = int(input())
cnt = 0
stack = [int(input())]
max_num = stack[-1]
for _ in range(n - 1):
num = int(input())
if stack[-1] < num:
cnt += num - stack[-1]
max_num = max(max_num, num)
stack.pop()
stack.append(num)
cnt += max_num * len(stack) - sum(stack)
print(cnt)
풀이2.
분할정복으로 max_idx를 pivot으로 좌우 분할 해 각 구간의 연산값을 더해주며 최상단까지 올라온다.
import sys
input = sys.stdin.readline
def count_add(nums, prev_max):
if not nums:
return 0
max_val = 0
min_val = float('inf')
for i in range(len(nums)):
if max_val < nums[i]:
max_val = nums[i]
max_idx = i
min_val = min(min_val, nums[i])
if max_val == min_val:
return prev_max - max_val
result = count_add(nums[:max_idx], max_val) + prev_max - max_val + count_add(nums[max_idx+1:], max_val)
return result
'practivceAlgorithm > 다시 봐야할 문제들' 카테고리의 다른 글
[백준][Python][삼성 2021 하반기 코딩테스트] 23289 온풍기 안녕! (0) | 2021.10.26 |
---|---|
[백준][Python] 2253 점프 (0) | 2021.10.16 |
[백준][Python] 19949 영재의 시험 (0) | 2021.10.13 |
[백준][Python] 1823 수확 (0) | 2021.10.06 |
[백준][Python] 1622 공통순열 (0) | 2021.10.06 |