Skip to content
🤖 HyoJ's WiKi
About

LeetCode) Best Time to Buy and Sell Stock 알고리즘 문제

Algorithm, CodingTest5 min read

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

문제 설명

가격 배열이 주어지는데, 가격[i]은 특정 주식의 째 날 가격입니다.

한 주식을 매수하기 위해 하루를 선택하고 해당 주식을 매도하기 위해 미래의 다른 날을 선택함으로써 수익을 극대화하고자 합니다.

이 거래에서 얻을 수 있는 최대 수익을 반환합니다. 수익을 얻을 수 없으면 0을 반환합니다.

Example 1:

  • Input:
    • prices = [7,1,5,3,6,4]
  • Output:
    • 5
  • Explanation:
    • 2일차에 매수(price = 1)하고 5일차에 매도(price = 6), 수익 = 6-1 = 5입니다.
    • 매도하기 전에 매수해야 하므로 2일차에 매수하고 1일차에 매도하는 것은 허용되지 않습니다.

Example 2:

  • Input:
    • prices = [7,6,4,3,1]
  • Output:
    • 0
  • Explanation:
    • 이 경우 트랜잭션이 수행되지 않으며 최대 수익은 0입니다.

Constraints:

  • 1 <= prices.length <= 10^5
  • 0 <= prices[i] <= 10^4

풀이 과정

  1. prices 배열이 비어있다면 return 0 처리 후 로직을 종료한다.

    if len(prices) == 0:
    return 0
  2. 이익 변수와 최소 가격 변수를 초기화 한다.

    profit = 0
    min_price = prices[0]
  3. prices 배열을 순회하는 for-in 문을 선언한다.

    for price in prices:
  4. 현재 가격이 최소 가격보다 낮으면 현재 가격을 최소 가격으로 설정하는 로직을 작성한다.

    if price < min_price:
    min_price = price
  5. 현재 가격에서 최소 가격을 뺀 값이 기존 이익보다 높으면 이익 변수를 업데이트하는 로직을 작성한다.

    else:
    profit = max(price - min_price, profit)
  6. for-in 문이 종료되면 이익을 return 한다.

    return profit

최종 제출 코드

class Solution(object):
def maxProfit(self, prices):
# 1. prices 배열이 비어있다면 return 0
if len(prices) == 0:
return 0
# 2. 이익 변수 초기화
profit = 0
# 3. 최소 가격 변수 초기화
min_price = prices[0]
for price in prices:
# 4. 현재 가격이 최소 가격보다 낮으면 현재 가격을 최소 가격으로 설정
if price < min_price:
min_price = price
else:
# 5. 현재가격 - 최소가격 뺀값이 기존 이익보다 높으면 이익을 업데이트
profit = max(price - min_price, profit)
return profit

시간, 공간 복잡도

시간 복잡도: O(n)

  • prices 배열을 한 번 순회하므로 O(n) 의 시간 복잡도를 가진다.

공간 복잡도: O(1)

  • prices 배열을 한 번 순회하고, 추가적인 배열을 사용하지 않으므로 O(1) 의 공간 복잡도를 가진다.

문제 풀이 기록

hyoj leet code submit history

다른 풀이 방법

더욱 간단한 풀이 방법 (시간: O(n), 공간: O(1))

class Solution(object):
def maxProfit(self, prices):
profit, min_buy = 0, float('inf')
for price in prices:
# 1. 현재 가격과 최소 가격을 비교하여 더 적은 것을 최소 가격으로 업데이트
min_buy = min(min_buy, price)
# 2. 현재 가격에서 최소 가격을 뺀것과 현재 이익을 비교하여 더 높은 것을 현재 이익으로 업데이트
profit = max(profit, price - min_buy)
return profit

회고

이번 문제는 쉽게 해결했다. 그리고 역시 더욱 간결한 풀이 방법이 있었다!

내가 푼 방법과 유사하게 풀었지만, 굳이 조건문을 넣지 않아서 더 간결한 코드였다.

© 2024 by 🤖 HyoJ's WiKi. All rights reserved.
Theme by LekoArts