파이썬 알고리즘 인터뷰 책을 정리한 포스트 입니다.
#12 주식을 사고팔기 가장 좋은 시점
한 번의 거래로 낼 수 있는 최대 이익을 산출하라
입력
1
prices = [7, 1, 5, 3, 6, 4]
출력
1
5
Brute Force 계산
1
2
3
4
5
6
7
def bruteForce(prices: list) -> int:
max_price = 0
for i, price in enumerate(prices):
for j in range(i, len(prices)):
max_price = max(prices[j] - price, max_price)
return max_price
Brute force
방식은 처음부터 사고 팔고를 반복해 마지막에 최대 이익을 산출하는 것이다.- 이 문제에서는 타임아웃으로 해결되지 않는다.
내 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def maxProfit(price: list) -> int:
'''
:param price: 주식 가격이 리스트로 주어진다
:return: 최대 이익 반환 :type: int
'''
minStock = 1000
maxStock = 0
nowDay = 0
for days, prices in enumerate(price):
if prices < minStock and nowDay < days:
minStock = prices
if prices > maxStock and nowDay < days:
maxStock = prices
return maxStock - minStock
- 최저점에 사서 최고점에 팔아야 하기 때문에 최대 최소값을 구해 차이로 이익을 구한다
- 값을 구할때 날짜가 지나가면 최저점과 최고점의 의미가 없기때문에
if
문에 날짜 조건을 걸어준다
저점과 현재 값과의 차이 계산
1
2
3
4
5
6
7
8
9
def maxProfit_low_now_val(prices: list) -> int:
profit = 0
min_price = sys.maxsize
# 최솟값과 최댓값을 계속 갱신
for price in prices:
min_price = min(min_price, price)
profit = max(profit, price - min_price)
return profit
- 그래프로 그려보면 고점과 저점을 확인할 수 있다
- 각 날짜의 주식 가격을 탐색하면서 최솟값과 최댓값을 갱신한다
- 갱신하면서 최대 이익을 계산한다