문제
홍준이는 요즘 주식에 빠져있다. 그는 미래를 내다보는 눈이 뛰어나, 날 별로 주가를 예상하고 언제나 그게 맞아떨어진다. 매일 그는 아래 세 가지 중 한 행동을 한다.
- 주식 하나를 산다.
- 원하는 만큼 가지고 있는 주식을 판다.
- 아무것도 안한다.
홍준이는 미래를 예상하는 뛰어난 안목을 가졌지만, 어떻게 해야 자신이 최대 이익을 얻을 수 있는지 모른다. 따라서 당신에게 날 별로 주식의 가격을 알려주었을 때, 최대 이익이 얼마나 되는지 계산을 해달라고 부탁했다.
예를 들어 날 수가 3일이고 날 별로 주가가 10, 7, 6일 때, 주가가 계속 감소하므로 최대 이익은 0이 된다. 그러나 만약 날 별로 주가가 3, 5, 9일 때는 처음 두 날에 주식을 하나씩 사고, 마지막날 다 팔아 버리면 이익이 10이 된다.
입력
입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타내는 N개의 자연수들이 공백으로 구분되어 순서대로 주어진다. 날 별 주가는 10,000이하다.
출력
각 테스트케이스 별로 최대 이익을 나타내는 정수 하나를 출력한다. 답은 부호있는 64bit 정수형으로 표현 가능하다.
풀이
주식을 사고 팔았을 때 최대 이익을 구해야한다.
이 문제는 반복문을 뒤에서 부터 접근 했을 때 쉽게 풀 수 있다.
만약 앞에서 부터 접근하면 반복문을 순회하면서 지나온 개수를 더하고,
다음 인덱스에서 가격이 떨어질 때 팔아야하므로 다음 인덱스와 비교를 해야 한다.
하지만 뒤에서 부터 접근한다면 단순히 현재 max값보다 현재 인덱스값이 더 작다면 그 차이만큼 이익을 더하면된다.
import sys
testCases = int(sys.stdin.readline().rstrip("\n"))
for _ in range(testCases):
n = int(sys.stdin.readline().rstrip("\n"))
nums = list(map(int, sys.stdin.readline().rstrip("\n").split()))
value=0
max=0
for i in range(len(nums)-1,-1,-1):
if(nums[i] > max):
max = nums[i]
else:
value+=max-nums[i]
print(value)
'백준 그리디 알고리즘' 카테고리의 다른 글
[백준 2873 파이썬] 롤러코스터 그리디 알고리즘 (0) | 2020.12.18 |
---|---|
[백준 13413 파이썬] 그리디 알고리즘 오셀로 재배치 (0) | 2020.12.16 |
파이썬 그리디 알고리즘 백준 13904 과제 (0) | 2020.12.15 |
파이썬 그리디 알고리즘 백준 1343 폴리오미노 (0) | 2020.12.15 |
파이썬 그리디 알고리즘 백준 2828 사과 담기 게임 (0) | 2020.12.15 |