문제

25년 간의 수행 끝에 원재는 미래를 보는 능력을 갖게 되었다. 이 능력으로 원재는 사재기를 하려고 한다.

다만 당국의 감시가 심해 한 번에 많은 양을 사재기 할 수 없다.

다음과 같은 조건 하에서 사재기를 하여 최대한의 이득을 얻도록 도와주자.

    1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
    2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
    3. 판매는 얼마든지 할 수 있다.

예를 들어 3일 동안의 매매가가 1, 2, 3 이라면 처음 두 날에 원료를 구매하여 마지막 날에 팔면 3의 이익을 얻을 수 있다.


[TC1]

입력: 3 5 9

정답: 10

풀이: 첫째, 둘째 날 물건을 구입해서 셋째 날에 팔면 6 + 4 = 10의 이익을 낼 수 있다.

 

[TC2]

입력: 10 7 6

정답: 0

풀이: 날짜가 지날 수록 가격이 줄어드므로 구매를 하지 않는다.

 

[TC3]

입력: 1 1 3 1 2

정답: 5

풀이: 첫째, 둘째날에 물건을 사서 셋째 날에 팔고, 넷째 날에 물건을 사서 다섯째 날에 팔면 (3 - 1) + (3 - 1) + (2 - 1) = 5의 이익이 난다.

내 생각

max 값의 인덱스를 구한 뒤 그 인덱스까지의 원소들을 더하고 price = price[index:] 를 통해 배열을 잘라줬다.

테스트케이스는 통과했지만 런타임 에러가 떳다.

def get_profit(arr):
    profit = 0
    max_price = max(arr)
    for j in range(arr.index(max_price)):
        profit += (max_price - arr[j])
    return profit

t = int(input())
answer = []
for i in range(t):
    n = int(input())
    price = list(map(int,input().split()))
    a = 0
    while len(price) > 1:
        if price.index(max(price)) > 0:
            a += get_profit(price)
        price = price[price.index(max(price))+1:]
    answer.append(a)

for i in range(t):
    print('#{} {}'.format(i+1,answer[i]))

풀이

배열의 맨 뒤 원소부터 비교하며 max값을 갱신해주면 된다. 

t = int(input())
answer = []
for i in range(t):
    n = int(input())
    price = list(map(int,input().split()))
    max_price = 0
    a = 0
    for j in range(len(price)-1,-1,-1):
        if price[j]>max_price:
            max_price=price[j]
        else:
            a += (max_price-price[j])
    answer.append(a)

for i in range(t):
    print('#{} {}'.format(i+1,answer[i]))

'Python > SWEA' 카테고리의 다른 글

[SWEA] D1 - 2063번 중간값 찾기  (0) 2023.05.09
[SWEA] D1-2071번 평균값 구하기  (0) 2023.05.09
복사했습니다!