티스토리 뷰

알고리즘

주식을 사고팔기 가장 좋은 시점

날따라해봐요요롷게 2022. 1. 17. 11:41

한 번의 거래로 낼 수 있는 최대 이익을 산출하라.

 

input : [7,1,5,3,6,4]
output : 5
>> 1 일 때 사서 6일 때 팔면 5의 이익을 얻는다.

 

해당 문제는 가장 저점일 때 구매하여 고점일 때 판매하면 되는 것이다.

 

그렇다면 우리는 가장 간단하게도 이중 for문을 돌려 비교하여 사고팔고를 반복하여 결과를 산출 할 수 있다.

하지만 그럴경우 O(n^2) 의 많은 실행시간을 허비한다.

 

def max_profit(prices):
    profit = 0

    for i, price in enumerate(prices):
        for j in range(i, len(prices)):
        	max_price = max(prices[j] - price, max_price)

    return profit

 

좀 더 효율적인 방법을 생각해봐야 할것이다.

 

이중 for문을 사용하지 않고 한 번의 for문을 사용하여 구하기 위해서 둬야할 체크포인트는 무엇일까?

 

한 번의 for문 시 최솟값을 알고 앞으로 나오는 수와 비교하였을 시 가장 큰 차이가 나는 경우를 뽑아야한다.

 

1. 최솟값

 

리스트의 첫 번째가 최솟값이 된다고 단언 할 수 없기에 이중  for문을 사용하지 않기 위해서 sys.maxsize를 사용하여 최솟값을 구한다. sys.maxsize는 파이썬의 정수는 가장 큰 수이다.

이를 이용하여 minNum = sys.maxsize 이고 앞으로 나오는 수가 더 작을 시 minNum으로 하는 코드를 짠다.

minNum = sysMaxsize #파이썬의 가장 큰 수
minNum = min(minNum, 리스트의 값)

 

2. 최대 이익산출

최대 이익을 구하기 위해서는 앞으로 나오는 값에 앞서 구한 최솟값 뺀 값 중 가장 큰 값을 구해야한다.

최대값은 항상 0보다는 커야하기에 그리고 input이 [] 빈 리스트의 경우 -sys.maxsize 가 리턴이 될수 있기에 0으로 설정을 해 코드를 작업한다. (개인적으로는 input을 안 넣는 경우는 없기에 알고리즘 적인 생각으로는 -sys.maxsize를 설정하는게 맞다고 생각한다.)

 

profit = -sys.maxsize #파이썬의 가장 작은 정수
profit = max(profit, 리스트의 값 - minNum)

리스트가  for문을 돌면서 각각의 값에 최솟값인 minNum을 빼서 차이를 비교한다. 

 

최종 코드

def max_profit(prices):
    profit = -sys.maxsize
    min_price = sys.maxsize

    for list_value in prices:
        min_price = min(min_price, list_value)
        profit = max(profit, list_value-min_price)

    return profit

 

'알고리즘' 카테고리의 다른 글

dfs - 섬의 개수(number of islands)  (0) 2022.01.21
DFS (GRAPH)  (0) 2022.01.21
스택, 큐  (0) 2022.01.18
연결리스트 / (문제) 팰린드롬 연결리스트  (0) 2022.01.17
그룹 애너그램  (0) 2022.01.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함