Coding Test

[LeetCode]121.주식을 사고팔기 가장 좋은 시점(Best Time to Buy and Sell Stock)

동만쓰 2022. 2. 18. 03:53

[문제]

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

 

·입력

[7,1,5,3,6,4]

·출력

5

·설명

1일 때 사서 6일 때 팔면 5의 이익을 얻는다.

 

[처음 작성한 코드]

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res=0
    
        for i,price in enumerate(prices):
    	    for j in range(i,len(prices)):
        	    res=max(prices[j]-price,res)
        return res

처음 떠오르는게 브루트 포스 방법이어서 작성해보았다. 당연히 타임아웃이다.

1행 리스트 문제를 풀 때 for문이 두개 이상 나오면 대부분 타임아웃이 되는 것 같다.

 

참고로 시간을 줄이기 위해서 enumerate를 애용하는 것이 좋다.

 

[수정 코드]

 

for문을 하나만 사용하도록 수정했다.

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
      profit=0
      min_val=sys.maxsize

      for p in prices:
        min_val=min(min_val,p)
        profit=max(profit,p-min_val)
      return profit

p에 p 이전 시점에 나온 최소값을 뺀 뒤 그 중 가장 큰 값이 가장 큰 이득이니까 위 코드로 해결이 가능하다. 

 

임의의 최소값, 최대값을 설정할 때, min_val=-9999999 이렇게 정의하게 되면 문제가 발생할 수 있다. 위 코드와 같이 sys.minsize, sys.maxsize를 사용하는 것을 추천한다.