본문 바로가기

백준

백준 20546 🐜기적의 매매법🐜 (JAVA)

 

문제

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

 

20546번: 🐜 기적의 매매법 🐜

1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을 출력한다. 모든 결과 따옴표를 제외하고 출력한다.

www.acmicpc.net

코드

package com.company;

import java.io.*;
import java.util.*;

public class Main {

    static class stock {
        int money = 0;
        int cnt = 0;

        public stock(int money, int cnt) {
            this.money = money;
            this.cnt = cnt;
        }

        public void buy_stock(int cnt, int todaycost) {
            if (this.money < todaycost * cnt) return;
            money -= todaycost * cnt;
            this.cnt += cnt;
        }

        public int sell(int todaycost) {
            this.money += this.cnt * todaycost;
            this.cnt = 0;
            return todaycost;
        }
    }

    static int n;
    static int[] price = new int[14];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        int bnp, timing;

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < 14; i++) {
            price[i] = Integer.parseInt(st.nextToken());
        }

        bnp = BNP();
        timing = Timing();

        if (bnp < timing)
            System.out.println("TIMING");
        else if (timing < bnp)
            System.out.println("BNP");
        else
            System.out.println("SAMESAME");

    }

    public static int BNP() {
        stock s = new stock(n, 0);

        for (int i = 0; i < 14; i++) {
            if (price[i] <= s.money) {
                s.buy_stock(s.money / price[i], price[i]);
            }
        }

        return (s.cnt * price[13]) + s.money;
    }

    public static int Timing() {
        stock s = new stock(n, 0);

        for (int i = 3; i < 14; i++) {
            if (price[i-1] < price[i - 2] && price[i - 2] < price[i - 3]) {
                s.buy_stock(s.money / price[i], price[i]);

            } else if (price[i-1] > price[i - 2] && price[i - 2] > price[i - 3]) {
                s.sell(price[i]);
            }
        }

        return (s.cnt * price[13]) + s.money;
    }

}

풀이

이 문제를 통해 구현 부분에 많이 약하다는 것을 알게 되었다. 내가 구해야 하는 것은 총 두가지로 하나는 BNP전략을 취했을때의 전체 자본이고 나머지 하나는 Timing전략을 취했을때의 가지고 있는 자본이다. 풀이 방법은 다음과 같다.

  • stock이라는 같은 클래스를 공유하게 끔 만들어준다. stock이라는 클래스는 일종의 계좌 역할을 하며 해당 stock이라는 클래스 안에는 sell이라는 메소드 buy라는 메소드 그리고 현재 가지고 있는 현금과 주식수의 정보를 가지고 있다.
  • 다음은 BNP와 Timing이라는 클래스를 만들어주는데 이때 stock구현체를 만들어 준다. 그리고 BNP의 경우에는 만약 구매가 가능하다면 전부 구매한다. Timing의 경우에는 3일 연속 전일대비 떨어지거나 올랐을때 사고 팔면 되는데 이때 주식 가격의 추세는 주식의 가격을 전역변수에 저장해놓은 걸로 파악한다.

 

'백준' 카테고리의 다른 글

백준 4396 지뢰 찾기 (JAVA)  (0) 2022.07.08
백준 2578 빙고 (JAVA)  (0) 2022.07.07
백준 21918 전구 (JAVA)  (0) 2022.07.05
백준 5597 과제 안 내신 분..? (JAVA)  (0) 2022.07.05
백준 20053 최소,최대2 (JAVA)  (0) 2022.07.05