[BOJ] 17521 - Byte Coin

Sierra·2022년 2월 20일
0

[BOJ] Greedy

목록 보기
24/33
post-thumbnail

문제

국제자본부동산회사(ICPC)는 바이트 코인(Byte Coin)에 자금을 투자하고 있다. 바이트 코인은 김박사가 만든 가상 화폐이다. 실제로는 바이트 코인 가격을 예상할 수 없지만 이 문제에서는 바이트 코인 가격 등락을 미리 정확히 예측할 수 있다고 가정하자.

우리는 1일부터 n일까지 n일 동안 그림 1과 같이 바이트 코인의 등락을 미리 알 수 있으며 우리에게는 초기 현금 W가 주어져 있다. 그림 1의 빨간색 네모는 해당 일자의 바이트 코인 가격을 나타낸다. 매일 바이트 코인을 매수하거나 매도할 수 있다고 하자. 다만 바이트 코인 하나를 나누어 매도하거나 매수할 수는 없다. 우리는 n일 날 보유하고 있는 모든 코인을 매도할 때 가지고 있는 현금을 최대화하고 싶다.

예를 들어, 그림 1과 같은 바이트 코인 등락 그래프를 첫날 미리 알 수 있다고 하고 우리에게 주어진 초기 현금이 24라고 하자. 수익을 최대한 높이려면 다음과 같이 바이트 코인을 매수, 매도할 수 있다. 첫 날 현금 20을 써서 4개의 코인을 산다. 둘째 날 모든 코인을 매도해서 현금 28을 얻고 모두 32의 현금을 갖게 된다. 5일째 되는 날 현금 32를 써서 16개의 코인을 매수한다. 7일째 되는 날 모든 코인을 매도해서 모두 128의 현금을 갖게 된다. 9일째 되는 날 현금 126을 써서 42개의 코인을 사고 10일 날 모든 코인을 매도한다. 그러면 10일 날 현금이 170이 되고 이것이 최대이다.

요일 수 n, 초기 현금 W, 1일부터 n일까지 각 요일의 바이트 코인 가격이 주어질 때, n일 날 보유하고 있는 모든 코인을 매도할 때 보유하게 될 최종 현금의 최댓값을 출력하는 프로그램을 작성하시오.

입력

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

출력

출력은 표준출력을 사용한다. n일 날 보유하고 있는 모든 코인을 매도할 때 가지고 있는 현금의 최댓값을 한 행에 출력한다. 비록 초기 현금 W는 그렇게 크지 않지만 최종 현금은 매우 커질 수 있음에 주의하자.

예제 입출력

  • 예제 입력 1
10 24
5
7
5
4
2
7
8
5
3
4
  • 예제 출력 1
170
  • 예제 입력 2
5 15
5
4
4
2
7
  • 예제 출력 2
50
  • 예제 입력 3
7 54
7
5
5
4
2
2
1
  • 예제 출력 3
54

Solution

#include <iostream>
#include <vector>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    long long N, W;
    cin >> N >> W;
    vector<int> dataList(N);
    for(int i = 0; i < N; i++) cin >> dataList[i];
    for(int i = 0; i < N - 1; i++){
        if(dataList[i] < dataList[i+1]){
            if((W / dataList[i]) > 0){
                long long tmp = W / dataList[i];
                W %= dataList[i];
                tmp = dataList[i+1] * tmp;
                W += tmp;
            }
        }
    }
    cout << W << '\n';
}

간단하다. i 인덱스 기준으로 i+1이 더 값이 크다면 사고 파는 행동을 반복하면 된다.
언제 사서 언제 판다가 아니라 그냥 무조건 가격이 싸면 사고 오르면 파는 것이다. 어차피 모든 가격 정보를 알고 있다는 가정하에 언제 사서 쭉 익을때까지 기다리는 것 보단 이게 훨씬 명확한 방법 아닐까.

for(int i = 0; i < N - 1; i++){
    if(dataList[i] < dataList[i+1]){
        if((W / dataList[i]) > 0){
            long long tmp = W / dataList[i];
            W %= dataList[i];
            tmp = dataList[i+1] * tmp;
            W += tmp;
        }
    }
}
cout << W << '\n';

지금 가진 돈으로 다 살 수 있다면? 일단 모두 산 다음 그 갯수만큼 다음 차수에 팔아버리는 시뮬레이션을 진행한다.

실제로 주식도 이렇게 무식하게 해도 되면 좋겠다...

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글