여니의 취준 준비/코딩테스트 (Python)

[n17521] Byte Coin in 파이썬

여니's 2021. 9. 9. 15:28

https://www.acmicpc.net/problem/17521

 

17521번: Byte Coin

입력은 표준입력을 사용한다. 첫 번째 줄에 요일 수를 나타내는 양의 정수 n과 초기 현금 W(1 ≤ n ≤ 15, 1 ≤ W ≤ 100,000)가 주어진다. 다음 n 개의 줄에서, i번째 줄은 i일의 바이트 코인 가격을 나

www.acmicpc.net


(처음 풀이)

매수 시점과 매도 시점을 먼저 파악하자 - !

매수는 가장 쌀 때, 매도는 가장 비쌀때!

매수는 하락 곡선 -> day -> 상승곡선 , day 시점에!

매도는 상승 곡선 -> day -> 하락 곡선, day 시점에!

 


(풀이)

첫 날엔 무조건 매수

마지막 날엔 무조건 매도

 

button으로 지나온 구간이 상승 구간이었는지, 하락 구간이었는지 판단하기

 

n, w = map(int, input().split())
array = [0 for _ in range(n)]
for i in range(n):
    array[i] = int(input())

'''
매도 : 가격이 가장 비쌀 때
매수 : 가격이 가장 쌀 때
'''

coin = 0  # 현재 코인 개수
cash = 0  # 현재 현금 금액
button = True  # True : up, False : down

for day, price in enumerate(array):
    if day == 0:
        coin += w // price
        cash += w % price

    if day == n - 1:  # 모든 코인 매수
        cash += coin * price
        print(cash)
        exit(0)

    if array[day] <= array[day + 1]:  # 매수 매도 x, 위로 올라가는 과정, 최대 꼭짓점 찾아가는 과정
        if button == False: # 현재 내려가던 중이었는데 다음 인덱스부터 금액이 다시 올라가는 경우 = 매수시점
            # 매수
            coin += cash // price
            cash -= coin * price
        button = True  # up-button up
        continue

    # 내려가는 과정 (최소 꼭짓점 찾아가는 과정)
    elif array[day] >= array[day + 1]:
        if button == True: # 현재 금액이 올라가는 상승곡선이었는데 다음 인덱스부터 금액이 다시 내려가는 경우 = 매도시점점
           # 매도
            cash += price * coin
            coin = 0
        button = False
        continue