

일별 주식 가격이 주어질 때 (열은 날짜의 흐름을 의미), 주식을 단 한번씩만 사고 팔 때, 가장 큰 수익을 거둘 수 있는 값을 구해야 한다.
그러면 일반적으로 가장 작은 값에 사서, 가장 큰 값에 팔아야 한다는 걸 생각할 수 있다. 그와 동시에 가장 작은 값은 팔 때의 값 이전까지 중 가장 작은 값을 의미한다.
따라서 다음과 같이 접근했다.
초기 min_val = arr[0], max_val = arr[1]-arr[0] 으로 두고,
1) 배열을 순회하면서
2) max_val = max(max_val, 현재값-min_val)
3) min_val = min(min_val, 현재값
으로 해주면 된다. 내가 값을 팔때의 min_val 은 동일한 날에 사고 팔 수 없으므로, min_val 은 max_val 을 갱신한 다음 갱신해준다.
import sys
input = sys.stdin.readline
# 주식으로 최대 수익을 내라
# 가장 적을 때 사서 가장 비쌀 때 팔아야 한다.
# 단 한번 사고, 단 한번 팔 수 있음
# (풀이)
# 반복문으로 가면서 min 값 구하면서
# 내 값 - min 의 값이 최대가 되는 max_val 을 관리한다.
arr = list(map(int, input().split()))
# 초기값
min_val = arr[0] # 가장 작은 값
max_val = arr[1]-arr[0] # 가장 큰 차익
# 배열 돌면서 가장 작은값 매번 갱신
for idx in range(1, len(arr)):
max_val = max(max_val, arr[idx]-min_val)
# 가장 작은 값 갱신
min_val = min(min_val, arr[idx])
# 결과 출력
print(max_val)