[Leetcode] 121. Best Time to Buy and Sell Stock

2024. 11. 14. 00:07·BE/algorithm

문제: Best Time to Buy and Sell Stock 

  • 관련 토픽: Array, Dynamic Programming
  • 난이도: Easy 
  • 링크 https://leetcode.com/problems/best-time-to-buy-and-sell-stock

요구사항

  • prices 배열은 i번째 날짜의 주식의 가격을 담음
  • 정해진 하루에 주식을 사고, 주식을 산 시점 이후에 주식을 판매
  • 주식을 구매, 판매하며 어떤 조합이 가장 큰 수익을 낼 수 있는지 탐색
  • 수익이 발생하지 않는 경우에는 0을 반환  

조건

  • 1 <= prices.length <= 10^5 (10만개) 
    • 10만개의 요소를 다루는 문제는 효율적으로 풀이 하는 것이 좋다 
    • O(n) ~ O(nlogn) 시간 복잡도의 풀이가 필요! 
  • 0 <= pricese[i] <= 10^4
    • 최대값,최소값을 구할 때 값 초기화의 기준으로 사용 가능

풀이 

문제 태그에는 Dynamic Programming으로 나와있긴 하지만, 여기서의 해법은 두가지의 포인터를 가지고 문제를 해결했다. 

이 문제를 해결할때 접근한 방식은: 

  • 지금 이 가격이 내가 지금까지 봐온 가격중에 가장 싼가? (주식 구매를 위해)
  • 지금 이 가격으로 판매를 하면 지금까지 확인한 최대 이율보다 더 좋은 수익을 발생 시킬 수 있나? 

이 두개의 기준을 가지고 문제를 풀이했다. Two pointer + Greedy 가 섞인 해법이다. 

 

1. prices = [7,1,5,3,6,4] 라고 했을 때, buy와 sell이라는 포인터를 추가한다 

 

2. prices 배열을 순회하면서, 가장 싼 가격과 가장 비싼 수익을 낼 수 있는 것을 찾는다. 가장 싼 가격을 찾았을 때는, buy를 sell (주로 탐색하는 포인터)로 변경을 한다.  

 

3. sell의 값을 기준으로 현재 수익을 확인한다.

 

4. 수익이 현재 최고수익 변수인 maxProfit 값보다 큰지 확인한다.

 

5. 현재 수익이 maxProfit보다 더 큰 경우, maxProfit의 값을 변경한다.

 

6. 남은 요소들중에 더 큰 수익을 낼 수 있는지, sell은 배열의 끝까지 탐색한다.

 

코드

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        buy, sell = 0, 1
        maxProfit = 0

        while sell < len(prices):
            if prices[buy] < prices[sell]:
                maxProfit = max(maxProfit, prices[sell] - prices[buy])
            else:
                buy = sell 
            sell += 1 

        return maxProfit

시간복잡도, 공간 복잡도

시간 복잡도: O(n)

  • 입력값의 길이에 따라 루프를 탐색 하므로 O(n)
  • sell은 prices의 모든 요소에 대해 한 번씩만 탐색!  n번 반복

공간 복잡도: O(1)

  • 입력값인 prices를 제외하고, maxProfit, buy, sell 변수만 사용해서 공간복잡도는 상수
저작자표시 비영리 변경금지 (새창열림)

'BE > algorithm' 카테고리의 다른 글

[Leetcode] 110. Balanced Binary Tree  (0) 2024.11.22
[Leetcode] 21. Merge Two Sorted Lists + 그림 풀이  (1) 2024.11.13
[LeetCode] 347. Top K Frequent Elements  (0) 2023.01.04
[LeetCode] 49. Group Anagrams  (0) 2023.01.03
[LeetCode] 1. Two Sum  (0) 2023.01.03
'BE/algorithm' 카테고리의 다른 글
  • [Leetcode] 110. Balanced Binary Tree
  • [Leetcode] 21. Merge Two Sorted Lists + 그림 풀이
  • [LeetCode] 347. Top K Frequent Elements
  • [LeetCode] 49. Group Anagrams
bandal-gom
bandal-gom
Devops & Backend Developer | tech blog
  • bandal-gom
    yayz's devlog
    bandal-gom
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • DevOps (22)
        • devops (4)
        • cicd (2)
        • docker (2)
        • monitoring (2)
        • nginx (4)
        • cache (1)
        • aws (1)
        • etc (6)
      • BE (21)
        • BE (3)
        • design pattern (1)
        • data structure (0)
        • spring (1)
        • algorithm (12)
      • devlog (24)
        • TIL (17)
        • programming language (2)
        • conference (2)
        • etc (3)
      • IT Review (1)
  • 블로그 메뉴

    • about.
    • 개발👩‍💻
    • etc.
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    모각코
    개발자취업
    Programmers
    jenkins
    키캡
    java
    프로그래머스
    hash
    time complexity
    티스토리챌린지
    NGINX
    Python
    코딩테스트준비
    릿코드
    homelab
    젠킨스
    leetcode 347
    오블완
    키보드케이블
    array
    알고리즘
    알고리즘문제풀이
    노트북하기좋은카페
    algorithm
    Kotlin
    LeetCode
    til
    항해99
    99클럽
    문제풀이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
bandal-gom
[Leetcode] 121. Best Time to Buy and Sell Stock
상단으로

티스토리툴바