상세 컨텐츠

본문 제목

백준 20546 : 기적의 매매법

밀라 알고리즘 스터디

by qkrtnals 2025. 1. 14. 14:01

본문

💡기본 정보

유형
: 시뮬레이션
풀이 날짜
: 2025년 01월14일 
풀이방법 한줄 요약
: 준현이의 주식하는 법, 성민이의 주식하는 법을 따로 정의하고 최종적으로 비교하기 

 

💡문제에서 구해야 할 것

준현이가 현금 100원으로 A기업의 주식을 사는 경우

준현이의 매매법
- 한 번 산 주식은 절대 팔지 않음
- 주식을 살 수 있다면 무조건 최대한 많이 삼

성민이의 매매법 
- 모든 거래는 전량 매수와 전량 매도로 이루어짐. 현재 가지고 있는 현금이 100원이고 주가가 11원이라면 99원어치의 주식을 매수
  단, 현금이 100원 있고 주가가 101원이라면 주식을  살 수 없음 . 빚을 내서 주식하지 않음
- 3일 연속 가격이 전일 대비 상승하는 주식은 다음날 무조건 가격이 하락한다고 가정. 따라서 현재 소유한 주식의 가격이 3일 째 상승한다면 전량 매도함 . 전일과 오늘의 주가가 동일하다면 가격이 상승한 것이 아님
- 반대로 3일 연속 가격이 전일 대비 하락하는 주식은 다음날 무조건 가격이 상승한다고 가정. 따라서 이러한 경향이 나타나면 즉시 주식을 전량 매수. 전일과 오늘의 주가가 동일하면 가격이 하락하는 것이 아님 

 

준현이와 성민이는 각자의 매매법 중 어떤 방법이 더 수익률이 높은지 겨뤄봄
내기 기간 : 2021년 1월 1일 - 20221년 1월 14일
2021년 1월 14일에 더 많은 자산을 보유한 사람이 승리
1월 14일의 자산 : 현금 + 1월 14일의 주가 x 주식 수 

- 입력 : 첫 번째 줄에 준현이와 성민이에게 주어진 현금
             두 번째 줄에 2021년 1월 1일 부터 2021년 1월 14일까지의 주가가 공백을 두고 차례대로 주어짐 ( 1000 이하의 양의 정수)
  출력 : 1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를 , 성민의 자산이 더 크다면 "TIMING"을 출력, 둘의 자산이 같다면 "SAMESAME"을 출력함 

 

💡알고리즘 설계

- 주식 매도 , 매수를 정의 
- 준현이의 매매법을 계산 : 살 수 있을 때마다 풀매수

- 성민이의 매매법을 계산 : 3일 연속 하락하면 전량 매도 / 3일 연속 상승하면 전량 매수 

- 두 사람이 14일에 가지고 있는 금액을 비교해서 결과값 출력

 

💡CODE

const fs = require("fs");
const input = fs.readFileSync(0, "utf8").toString().trim().split("\n");
const seedMoney = parseInt(input[0]);
const company = input[1].split(" ").map(Number);

let jMoney = seedMoney;
let sMoney = seedMoney;
let jStock = 0;
let sStock = 0;

function Buy(money, price, stock) {
  while (money >= price) {
    stock++;
    money -= price;
  }
  return [money, stock];
}

function Sell(money, price, stock) {
  while (stock > 0) {
    stock--;
    money += price;
  }
  return [money, stock];
}

function JH() {
  for (let i = 0; i < 14; i++) {
    [jMoney, jStock] = Buy(jMoney, company[i], jStock);
  }
  return [jMoney, jStock];
}

function SM() {
  for (let i = 3; i < 14; i++) {
    if (company[i - 3] < company[i - 2] && company[i - 2] < company[i - 1]) {
      [sMoney, sStock] = Sell(sMoney, company[i], sStock);
    }

    if (company[i - 3] > company[i - 2] && company[i - 2] > company[i - 1]) {
      [sMoney, sStock] = Buy(sMoney, company[i], sStock);
    }
  }
}

function answer() {
  const Junhyeon = jMoney + jStock * company[13];
  const Sungmin = sMoney + sStock * company[13];

  if (Junhyeon > Sungmin) {
    return "BNP";
  } else if (Junhyeon < Sungmin) {
    return "TIMING";
  } else {
    return "SAMESAME";
  }
}

JH();
SM();
console.log(answer());

 

💡시간복잡도

💡 틀린 이유 & 틀린 부분 수정

매도매수를 각 JH,SM에 구현하려고 하다보니 길이가 길어지고 오류가 더 발생하는 것을 알게되고 buy와 sell로 함수를 정의해 사용

💡 다른 풀이 or 기억할정보

Math.floor() : 내림값을 구함

'밀라 알고리즘 스터디' 카테고리의 다른 글

백준 14501 : 퇴사  (0) 2025.01.16
백준 2578 : 빙고  (0) 2025.01.15
개념 정리 : 시간복잡도 정리  (1) 2025.01.13
백준 1547 : 공  (0) 2025.01.13
백준 1051 : 숫자 정사각형  (0) 2025.01.11

관련글 더보기