Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 주식을 여러 번 사고팔아 얻을 수 있는 최대 수익 계산하기

시간순으로 정렬된 어떤 회사의 주가 리스트가 있다고 가정해 봅시다. 이때 해당 주식을 원하는 만큼 여러 번 사고팔았을 때 얻을 수 있는 최대 수익을 구하는 것이 목표입니다. 단, 매도하기 전에 반드시 먼저 매수해야 한다는 조건을 기억해야 합니다.

예를 들어 입력이 prices = [10, 50, 30, 40, 60]이라면 출력은 70이 됩니다. 10에 매수해서 50에 팔고, 다시 30에 매수해서 60에 팔면 되기 때문입니다.

문제 해결 접근 방법

이 문제는 탐욕 알고리즘(Greedy Algorithm)으로 간단하게 해결할 수 있습니다. 핵심 아이디어는 인접한 두 날의 가격을 비교하여 가격이 올랐다면 그 차익을 모두 더하는 것입니다. 연속된 상승 구간을 하나의 거래로 묶어도 결국 각 상승분의 합과 같기 때문에, 모든 양의 가격 차이를 누적하면 곧 최대 수익이 됩니다.

구체적인 단계는 다음과 같습니다.

  • prev_price를 무한대(∞)로 초기화합니다.
  • profit을 0으로 초기화합니다.
  • prices의 각 가격 p에 대해 다음을 반복합니다.
    • p가 prev_price보다 크면, profit에 (p − prev_price)를 더합니다.
  • 매 반복마다 prev_price를 현재 가격 p로 갱신합니다.
  • 반복이 끝나면 profit을 반환합니다.

예제 코드

class Solution:
    def solve(self, prices):
        prev_price = float("inf")
        profit = 0
        for p in prices:
            if p > prev_price:
                profit += p - prev_price
            prev_price = p
        return profit

ob = Solution()
print(ob.solve([10, 50, 30, 40, 60]))

입력

[10, 50, 30, 40, 60]

출력

70

동작 과정 살펴보기

  • 첫째 날(10): 비교 대상이 없으므로 prev_price만 10으로 갱신됩니다.
  • 둘째 날(50): 50 > 10 → 수익 40을 누적합니다.
  • 셋째 날(30): 가격이 하락했으므로 수익에 반영하지 않습니다.
  • 넷째 날(40): 40 > 30 → 수익 10을 추가합니다. (누적 50)
  • 다섯째 날(60): 60 > 40 → 수익 20을 추가합니다. (누적 70)

이처럼 하루 전 가격보다 오른 날의 차익만 모두 더하면, 여러 번의 매매로 얻을 수 있는 최대 수익인 70을 손쉽게 구할 수 있습니다.