20546번 기적의 매매법

개나뇽·2024년 4월 16일
0

문제 링크

문제 요약

  1. 준현, 성민 두 사람이 각자의 매매법을 통해 A기업에 투자하여 누가 더 수익률이 높은지 겨뤄보기로 했다.
  2. 준현은 주식을 살 수 있다면 즉시 무조건 최대한 많이 산다. 또한 절대 주식을 다시 팔지 않는다.
  3. 성민은 모든 거래는 전량 매수와 전량 매도로 이루어진다.
  4. 성민은 3일 연속 전날대비 주가가 오른다면 다음날 주가하락이 된다 생각하여 전량 매도한다. 전일과 오늘의 주가가 동일하다면 가격이 상승한 것이 아니다.
  5. 성민은 3인 연속 전날대비 주가가 하락한다면 다음날 주가상승이 된다 생각하여 전량 매수한다. 전일과 오늘의 주가가 동일하다면 가격이 하락한 것이 아니다.
  6. 기준일에 준현의 자산이 더 크다면 "BNP"를 성민의 자산이 더 크다면 "TIMING" 자산이 같다면 "SAMESAME"을 출력한다.

입력 예제

접근 방법

static String[] stock; // 주가
static int jc, sc; // 준현, 성민의 보유 현금
static int numJ, numS; // 준현, 성민의 보유 주식 수

먼저 날짜별로 주가를 저장한 배열, 두 사람이 각각 보유한 현금과 주식 수를 저장할 변수를 생성한다.

BufferedReader br = new BufferedReader(new InputStreamReader(in));
    int cash = Integer.parseInt(br.readLine()); // 주어지는 현금
    stock = br.readLine().split(" "); // 주어지는 주가는 공백을 두고 주어진다.

    // 현금 입금
    jc = cash;
    sc = cash;
	// 거래는 14일간 진행
    for (int i = 0; i < 14; i++) {
      int money = Integer.parseInt(stock[i]); // 현재 주가

      // 준현의 매매
      if (jc != 0 && jc / money > 0) {
        numJ += jc / money;
        jc = jc % money;
        out.println(jc);
      }

      if (i > 2) {
        sTrading(money, i);
      }
    }
    // 금액 결산
    jc += numJ * Integer.parseInt(stock[13]);
    sc += numS * Integer.parseInt(stock[13]);

    if (jc > sc) {
      out.println("BNP");
    } else if (jc == sc) {
      out.println("SAMESAME");
    } else {
      out.println("TIMING");
    }
  }

첫 번째줄에 주어진 현금을 위에서 선언한 현금 변수에 저장한다.
거래는 14일간 진행이되므로 주가를 저장하는 배열에 반복문을 통해 주가를 저장한다.

준현의 매매는 현금이 0원이 아님과 동시에 현금을 주가로 나눴을떄 0보다 크다면 매매가 이뤄진다.

public static void sTrading(int money, int cnt) {
  // 성현의 매매법은 3일 연속 가격이 전날대비 상승하면 전량 매도  하락하면 전량 매수
  int num3 = Integer.parseInt(stock[cnt - 3]); // 3일전
  int num2 = Integer.parseInt(stock[cnt - 2]); // 2일전
  int num1 = Integer.parseInt(stock[cnt - 1]); // 1일전

  if (numS != 0 && num1 < money && num2 < num1 && num3 < num2) {
    // 3일 연속 상승했다면 판매!
    sc += money * numS;
    numS = 0; // 전량 매도

  } else if (sc != 0 && sc / money > 0 && num1 > money && num2 > num1 && num3 > num2) {
    // 3일 연속 하락했다면 모두 구매!
    numS += sc / money;
    sc = sc % money;
  }

성민의 매매법은 전날의 주가에 대한 비교군이 필요하기에 'i > 2' 라는 조건이 붙었다.
파라미터로 주가와 인덱스 값을 받아 3일간의 주가를 구해 각각 num1,2,3에 할당후 각각 하락시 또는 상승시의 매매 전략을 조건으로 하여 계산식을 만들었다.

  • 준현의 매매 방식은 단순 구현이 가능했으나 성민의 방식은 조금 이해하는데에 시간이 필요했었다.
profile
정신차려 이 각박한 세상속에서!!!

0개의 댓글