백준/Search
[그리디/백준] 11051번 : 주식
ydin
2022. 7. 16. 18:10
-문제 : https://www.acmicpc.net/problem/11501
스스로 푼 문제다! Silver Level 2 문제.
처음에는 증가하는 부분수열 문제인가? 싶었는데, 1 1 3 1 2 같은 경우 부분 수열이 [1,1,3], [1,2] 두개가 있어서 이거를 어떻게 해야할지 몰랐다. 그래서 생각한게 완전탐색. 이걸로 돌리면 예제는 다 맞는데, 시간 복잡도가 n^2이라서 시간 초과가 떴다.
이전에 그리디에서 완전탐색으로 쓴맛을 많이 봤기에 어떻게 해야하나 생각을 했다.
순간 떠오른 방법이 리스트 거꾸로 진행하는 것. 그러면서 작은 인덱스의 값이 더 크다면 result라는 리스트의 해당 인덱스 값을 변경하고, 아니면 누적하는 방법을 생각했다.
그런데 위 방법으로는 8%에서 틀리길래 반례를 생각해 봤더니, 1,1,3,1,2,5 였다. 가장 큰 값이 오른쪽 끝에 있을 때 위 방법으로는
result=[3,3,3,5,5,5]인데 이것보다 [5,5,5,5,5,5]이 더 큰 값을 가진다.
따라서 data인덱스 값 뿐 아니라 result 인덱스의 값도 같이 비교해준 뒤 result 값을 갱신하는 방식으로 진행했더니 정답이 떴다
-정답 풀이:
import sys
input=sys.stdin.readline
for _ in range(int(input())):
n=int(input())
data=list(map(int,input().split()))
result=[0]*n
result[-1]=data[-1]
for i in range(n-2,-1,-1):
if data[i]>data[i+1] and data[i]>result[i+1]:
result[i]=data[i]
else:
result[i]=result[i+1]
answer=0
for i in range(n):
answer+=result[i]-data[i]
print(answer)