허비의 기술블로그

[SWEA] 백만 장자 프로젝트(1859) - PYTHON 본문

SWEA

[SWEA] 백만 장자 프로젝트(1859) - PYTHON

허비1411 2022. 4. 30. 11:06

1차원 배열을 입력받아 원소 순서별로 사거나 팔 수 있다고 가정할 때, 최대 이익을 구하는 문제이다.

시간복잡도: O(N)

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


테스트 케이스

[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의 이익이 난다.


풀이과정

 

처음에는 단순히 배열의 최댓값을 구한다음, 최댓값과 모든 원소들과 차이의 합을 구하면 된다고 생각했는데, [TC3]처럼 중간에 판매하고 뒤에서 다시 판매하는 경우가 생기므로 단순히 배열의 최댓값에서 판매를 하면 안 된다.

풀이 방법을 고민하다가 배열의 끝 요소부터 앞으로 가면서 현재까지의 최댓값을 저장하며  현재 요소가 최댓값보다 작다면 그 차이를 정답 값에 더하는 방식(물건 구매)으로 계산하면 되겠다는 생각을 했다. 현재 요소가 최댓값보다 크다면, 최댓값을 갱신하고 다음 요소로 넘어간다.

 


코드 

N = int(input())
for i in range(N):
    M = int(input())
    answer = 0
    arr = list(map(int, input().split()))
    sellPrice = 0

    for val in arr[::-1]:
        if val >= sellPrice:
            sellPrice = val
        else:
            answer += sellPrice - val
    print("#", i + 1, " ", answer, sep="")

 

주석 추가

N = int(input()) # 전체 TC 갯수
for i in range(N): # TC마다
    M = int(input()) #배열의 길이 (안쓰임)
    answer = 0 #출력할 정답
    arr = list(map(int, input().split())) #배열 입력 받기
    sellPrice = 0 #현재 판매가격(최댓값)

    for val in arr[::-1]: # 배열 거꾸로 순회
        if val >= sellPrice: #현재 값이 최댓값보다 크거나 같다면
            sellPrice = val #최댓값 업데이트
        else:
            answer += sellPrice - val #아니라면 정답값에 가격차이를 더한다. (현재 값에 구매해서 최댓값에 판다)
    print("#", i + 1, " ", answer, sep="") #출력 양식에 맞춰서 출력

 

'SWEA' 카테고리의 다른 글

[SWEA] Flatten(1208) - PYTHON  (0) 2022.05.02
[SWEA] VIEW(1206) - PYTHON  (0) 2022.05.01
[SWEA] 스도쿠 검증(1974) - PYTHON  (0) 2022.04.30
[SWEA] 간단한 369게임(1926) - PYTHON  (0) 2022.04.30
Comments