'''
구성은
1. 문제 설명
2. 원본 문제(코드)
3. 강사 답안
4. 주최측 답안
순으로 되어있습니다.
빈칸채우기와 한 줄 수정의 경우
강사 답안과 주최 답안이 유사 / 동일할 수 있습니다.
#문제10
지난 연속된 n일 동안의 주식 가격이 순서대로 들어있는 리스트가 있습니다.
이때, 다음 규칙에 따라 주식을 사고 팔았을 때의 최대 수익을 구하려 합니다.
* n일 동안 주식을 단 한 번 살 수 있습니다.
* n일 동안 주식을 단 한 번 팔 수 있습니다.
* 주식을 산 날에 바로 팔 수는 없으며, 최소 하루가 지나야 팔 수 있습니다.
* 적어도 한 번은 주식을 사야하며, 한 번은 팔아야 합니다.
주식을 팔 때는 반드시 이전에 주식을 샀어야 하며, 최대 수익은 양수가 아닐 수도 있습니다.
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 리스트 prices가 매개변수로 주어질 때,
주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 하도록 solution 함수를 작성했습니다.
그러나, 코드 일부분이 잘못되어있기 때문에, 코드가 올바르게 동작하지 않습니다.
주어진 코드에서 _**한 줄**_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.
---
#####매개변수 설명
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 리스트 prices가 solution 함수의 매개변수로 주어집니다.
* prices의 길이는 2 이상 1,000,000 이하입니다.
* prices의 각 원소는 1 이상 1,000 이하의 자연수입니다.
---
#####return 값 설명
주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 해주세요.
---
##### 예시
| prices | return |
|--------- |-------- |
| [1,2,3] | 2 |
| [3,1] | -2 |
##### 예시 설명
예시 #1
연속된 3일의 주가가 차례로 [1, 2, 3] 이며, 첫째 날에 주식을 사서 셋째 날에 팔면 수익은 2이고, 이때가 최대입니다.
예시 #2
문제에서 설명한 것처럼 무조건 한 번은 매수하고, 한 번은 매도해야 합니다.
첫째 날에 매수하여 둘째 날에 매도하는 방법밖에 없기 때문에 수익은 -2, 즉 2만큼 손실을 보게 됩니다.
def solution(prices):
INF = 1000000001;
tmp = INF
answer = -INF
for price in prices:
if tmp != INF:
answer = max(answer, tmp - price)
tmp = min(tmp, price)
return answer
#The following is code to output testcase. The code below is correct and you shall correct solution function.
prices1 = [1, 2, 3];
ret1 = solution(prices1);
#Press Run button to receive output.
print("Solution: return value of the function is", ret1, ".")
prices2 = [3, 1];
ret2 = solution(prices2);
#Press Run button to receive output.
print("Solution: return value of the function is", ret2, ".")
'''
def solution(prices):
INF = 1000000001;
tmp = INF
answer = -INF
for price in prices:
print('\n')
print('by_iter_price', price)
if tmp != INF: # 첫 반복시 실행되지 않습니다.(매수가 일어나야 하기 때문)
print('1_answer, price, tmp', answer, price, tmp)
answer = max(answer, price - tmp) # 이 코드는 매도시 차익을 구하는 부분입니다. price 하강시 answer 변화가 없습니다.
print('2_answer, price, tmp', answer, price, tmp)
print('11_answer, price, tmp', answer, price, tmp)
tmp = min(tmp, price) # 매수시 가장 낮은 지점을 고르기 위한 코드입니다. 가격이 상승시 tmp 변화가 없습니다.
print('22_answer, price, tmp', answer, price, tmp)
return answer
#The following is code to output testcase. The code below is correct and you shall correct solution function.
prices1 = [1, 2, 3];
ret1 = solution(prices1);
#Press Run button to receive output.
print("Solution: return value of the function is", ret1, ".")
prices2 = [3, 2, 0];
ret2 = solution(prices2);
#Press Run button to receive output.
print("Solution: return value of the function is", ret2, ".")
'''
주최 제공답안
def solution(prices):
inf = 1000000001;
mn = inf
ans = -inf
for price in prices:
if mn != inf:
ans = max(ans, price - mn)
mn = min(mn, price)
return ans
'''