리트코드 알고리즘/리트코드 easy

(간단한 코드)리트코드 121. Best Time to Buy and Sell Stock

문학적 딥러닝 2024. 12. 8. 16:35

 

주식과 같이 매 순서마다 바뀌는 가격에 따라 최대의 이윤을 남기는 문제이다. 

 

여기서 나는 우선 "가장 낮은 가격대를 기준으로 고르면 금방이겠네!"라고 생각을 했지만, 아니었다.

 

이 와 같은 경우 가장 낮은 수는 1이지만, 이윤은 남길 수 있었다. 

 

그렇다면, 우리는 두가지를 고려해야 한다, 하나는 언제 살지를 의미하는 "최소값"과 판 후의 "최대 이윤"이다.

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        m, M = float('inf'), 0

        for price in prices:
            if price < m:
                m = price
            
            profit = price - m

            if profit > M:
                M = profit
        return M

 

우선 최소값으로 가장 작은건 0이라고 문제 아래에 표시를 해 주었지만, 많은 문제에서 값을 적당히 주면 1000000000000000과 같은 극단적인 경우의 수를 내놓기 때문에 float('inf')라는 무한이라는 수치를 사용하는 것에 익숙해지는 것이 좋다(float('-inf')는 마이너스 무한이다).

 

 우선 prices라는 리스트에서 값을 price로 받아주고, 이 값이 m(최소값)보다 작을 경우 대치해주고, 이윤을 본다(첫번째 반복일 경우에는 이윤이 "본인 빼기 본인"이므로 0이 나오는게 맞다).

 

후에 기존에 있는 이윤보다 "큰지"만 확인하는게 중요하기 때문에, 만약에 크다면 M(최대 이윤)을 대치해준다.

 

그리고 for문이 다 돌면 결과적으로 남는 최대 이윤 M을 반환하면 된다.

 

(리스트 명칭 뒤에 s가 붙어 있는 경우는 실무에서도 많이 사용하고, 이를 꺼내올 때 s를 없애는 경우도 많이 쓴다, 다만 혼자 코딩을 풀다보면, 명칭을 쓰는게 귀찮아져서 짧게 쓰는 경우가 많은데, 지금 익숙해지는 것이 좋다)