오늘 문제는 이전 문제인 게임을 만든 동준이와 접근 방법이 유사합니다. 두 문제를 비교하면서 풀어보면 좋을것 같습니다.
홍준이는 요즘 주식에 빠져있다. 그는 미래를 내다보는 눈이 뛰어나, 날 별로 주가를 예상하고 언제나 그게 맞아떨어진다. 매일 그는 아래 세 가지 중 한 행동을 한다.
홍준이는 미래를 예상하는 뛰어난 안목을 가졌지만, 어떻게 해야 자신이 최대 이익을 얻을 수 있는지 모른다. 따라서 당신에게 날 별로 주식의 가격을 알려주었을 때, 최대 이익이 얼마나 되는지 계산을 해달라고 부탁했다.
예를 들어 날 수가 3일이고 날 별로 주가가 10, 7, 6일 때, 주가가 계속 감소하므로 최대 이익은 0이 된다. 그러나 만약 날 별로 주가가 3, 5, 9일 때는 처음 두 날에 주식을 하나씩 사고, 마지막날 다 팔아 버리면 이익이 10이 된다.
입력
입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타내는 N개의 자연수들이 공백으로 구분되어 순서대로 주어진다. 날 별 주가는 10,000이하다.
출력
각 테스트케이스 별로 최대 이익을 나타내는 정수 하나를 출력한다. 답은 부호있는 64bit 정수형으로 표현 가능하다.
예제 입력 1
3
3
10 7 6
3
3 5 9
5
1 1 3 1 2
예제 출력 1
0
10
5
이 문제는 주식 거래에서 최대 이익을 계산하는 문제입니다.
테스트 케이스에서 미래 주가가 주어질 때, 최대 이익을 얻기 위해 어떤 전략을 써야 할지 계산해야 합니다.
매일 아래 세 가지 중 한 행동을 합니다.
주어진 예시를 살펴보겠습니다.
입출력은 다음과 같습니다:
미래의 주가는 알 수 없습니다. 하지만 주어진 문제는 미래의 주가가 주어집니다. 그렇다면 어떻게 해야 최대의 이익을 구할수있을까요?
바로, 미래의 최고 주가와 비교하여 현재 시점에서 주식을 팔지 여부를 결정해야 합니다.
따라서 뒤에서부터 주가를 역순으로 탐색하면서, 현재까지의 최대 주가를 업데이트하며 이익을 계산합니다.
즉, 매 순간 최대 주가인지를 파악하면서 이익을 계산하기 때문에 그리디 알고리즘 유형이라고 할 수 있습니다.
바로 코드를 설계해보도록 하겠습니다.
import sys
def sol(prices):
profit = 0
max_profit = 0
for price in reversed(prices):
if price > max_profit:
max_profit = price
else:
profit += max_profit - price
return profit
T = int(sys.stdin.readline().strip())
for _ in range(T):
N = int(sys.stdin.readline().strip())
prices = list(map(int, sys.stdin.readline().split()))
print(sol(prices=prices))
sol
함수:이번 문제는 그리디 알고리즘을 활용한 최적화 문제입니다.
이 문제를 통해 그리디 알고리즘과 배열을 효율적으로 탐색하는 방법을 익힐 수 있었습니다.
글 읽어주셔서 감사합니다.
꾸준히 나아갑니다!!