[백준-20546] 🐜 기적의 매매법 🐜

2024. 11. 25. 22:04·🏴알고리즘

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

문제 요약

  • 목표: 두 투자자, 준현이와 성민이의 투자 전략 중 어떤 것이 더 높은 수익률을 내는지 비교한다.
  • 제공 정보:
    1. 초기 현금
    2. 14일 동안 매일 변하는 주식 가격 리스트
  • 투자 전략:
    1. 준현이의 "BNP" 전략:
      • 주식을 살 수 있으면 최대한 많이 산다.
      • 한 번 산 주식은 절대 팔지 않는다.
    2. 성민이의 "TIMING" 전략:
      • 주식 가격이 3일 연속 상승하면 보유 주식을 전부 판다.
      • 주식 가격이 3일 연속 하락하면 보유 현금으로 최대한 많이 산다.
  • 결과 계산:
    • 14일째 (마지막 날) 각자의 총 자산을 계산합니다.
    • 자산 = 남은 현금 + (보유 주식 수 × 마지막 날 주식 가격)

 

문제를 풀기 위한 가정

  1. 투자 제한:
    • 주식을 매수할 때는 가진 돈으로만 사고, 빚을 내지 않습니다.
    • 주식을 매도할 때는 현재 보유한 주식만 팔 수 있습니다.
  2. 자산 계산:
    • 자산은 항상 현금 + (보유 주식 × 현재 주가)로 계산합니다.
  3. 승자 결정:
    • 준현이의 자산이 더 크면 "BNP" 를 출력
    • 성민이의 자산이 더 크면  "TIMING" 을 출력
    • 둘의 자산이 같으면 "SAMESAME" 을 출력

100
10 20 23 34 55 30 22 19 12 45 23 44 34 38

  • 첫 줄: 초기 현금 100.
  • 둘째 줄: 14일 동안 주식 가격 (10, 20, 23, 34, ...).
 
const input = require('fs')
    .readFileSync('input.txt')
    .toString()
    .trim()
    .split('\n');

const cash = Number(input[0]);   // 준현이와 성민이의 초기 현금
const prices = input[1].split(' ').map(Number); // 14일간의 주식 가격

 

input.txt에서 데이터를 읽어옵니다.

  • 첫 번째 줄: cash → 초기 자본금.
  • 두 번째 줄: prices → 14일간의 주식 가격 리스트.

(

  • cash = 100
  • prices = [10, 20, 23, 34, 55, 30, 22, 19, 12, 45, 23, 44, 34, 38
  • )
// BNP 전략 구현
function calculateBNP(cash, prices) {
    let shares = 0; // 보유 주식 수
    let money = cash; // 남은 현금

    for (let price of prices) {
        const canBuyShares = Math.floor(money / price); // 매수 가능한 주식 수
        shares += canBuyShares; // 주식 추가
        money -= canBuyShares * price; // 사용된 현금 차감
    }

    // 마지막 자산 계산
    return money + shares * prices[prices.length - 1];
}

 

 

  • 주식을 살 수 있으면 가능한 만큼 사고, 남은 현금은 그대로 유지합니다.
  • 주식을 판다는 개념이 없으므로, 마지막 날까지 보유 주식 수는 계속 누적됩니다.
  • 자산 계산:
    • 남은 현금 + (보유 주식 × 마지막 날 주식 가격).

 

 

예시:

  1. 첫날 주식 가격: 10, 초기 현금: 100
    • 매수 가능한 주식: Math.floor(100 / 10) = 10
    • 보유 주식: 10, 남은 현금: 0.
  2. 이후 가격이 올라가도 더 이상 살 수 없음.
  3. 마지막 날(14일째) 주식 가격: 38
    • 총 자산: 0 (남은 현금) + 10 × 38 = 380.

// TIMING 전략 구현
function calculateTIMING(cash, prices) {
    let shares = 0; // 보유 주식 수
    let money = cash; // 남은 현금

    let upCount = 0; // 3일 연속 상승일 경우 체크
    let downCount = 0; // 3일 연속 하락일 경우 체크

    for (let i = 1; i < prices.length; i++) {
        if (prices[i] > prices[i - 1]) { // 전날보다 가격 상승
            upCount++;
            downCount = 0;
        } else if (prices[i] < prices[i - 1]) { // 전날보다 가격 하락
            downCount++;
            upCount = 0;
        } else { // 가격 변동 없음
            upCount = 0;
            downCount = 0;
        }

        // 3일 연속 상승 → 전량 매도
        if (upCount >= 3 && shares > 0) {
            money += shares * prices[i]; // 주식을 모두 팔아 현금 추가
            shares = 0;
        }

        // 3일 연속 하락 → 전량 매수
        if (downCount >= 3) {
            const canBuyShares = Math.floor(money / prices[i]); // 매수 가능한 주식 수
            shares += canBuyShares; // 주식 추가
            money -= canBuyShares * prices[i]; // 사용된 현금 차감
        }
    }

    // 마지막 자산 계산
    return money + shares * prices[prices.length - 1];
}

 

    • 3일 연속 상승: 주식 가격이 다음 날 하락한다고 가정하고 모든 주식을 매도합니다.
    • 3일 연속 하락: 주식 가격이 다음 날 상승한다고 가정하고 모든 현금으로 매수합니다.
    • 주식 가격이 변동 없으면 상승/하락 카운트를 초기화합니다.

예시:

  1. 3일 연속 상승 (주가: 10 → 20 → 23 → 34):
    • 4일째 전량 매도.
  2. 3일 연속 하락 (주가: 30 → 22 → 19 → 12):
    • 8일째 전량 매수.
  3. 마지막 날 자산 계산:
    • 남은 현금 + (보유 주식 × 14일째 주가).
// 결과 계산
const bnpAssets = calculateBNP(cash, prices); // BNP 전략 결과
const timingAssets = calculateTIMING(cash, prices); // TIMING 전략 결과

// 결과 출력
if (bnpAssets > timingAssets) {
    console.log("BNP");
} else if (bnpAssets < timingAssets) {
    console.log("TIMING");
} else {
    console.log("SAMESAME");
}

 

 

전체코드


const input = require('fs')
    .readFileSync('input.txt')
    .toString()
    .trim()
    .split('\n');

const cash = Number(input[0]); // 초기 현금
const prices = input[1].split(' ').map(Number); // 14일간의 주식 가격

// BNP
function calculateBNP(cash, prices) {
    let shares = 0; // 보유 주식 수
    let money = cash; // 남은 현금

    for (let price of prices) {
        const canBuyShares = Math.floor(money / price); // 구매 가능한 주식 수
        shares += canBuyShares; // 주식 추가
        money -= canBuyShares * price; // 사용된 현금 차감
    }

    // 마지막 자산 계산
    return money + shares * prices[prices.length - 1];
}

// TIMING
function calculateTIMING(cash, prices) {
    let shares = 0; // 보유 주식 수
    let money = cash; // 남은 현금

    let upCount = 0;
    let downCount = 0;

    for (let i = 1; i < prices.length; i++) {
        if (prices[i] > prices[i - 1]) { // 전보다 상승
            upCount++;
            downCount = 0;
        } else if (prices[i] < prices[i - 1]) { // 전보다 하락
            downCount++;
            upCount = 0;
        } else { // 가격 변동 없음
            upCount = 0;
            downCount = 0;
        }

        // 3일 연속 상승 → 판매
        if (upCount >= 3 && shares > 0) {
            money += shares * prices[i]; // 주식을 모두 팔아 현금 추가
            shares = 0;
        }

        // 3일 연속 하락 → 구매
        if (downCount >= 3) {
            const canBuyShares = Math.floor(money / prices[i]); // 매수 가능한 주식 수
            shares += canBuyShares; // 주식 추가
            money -= canBuyShares * prices[i]; // 사용된 현금 차감
        }
    }

    // 마지막 자산 계산
    return money + shares * prices[prices.length - 1];
}

const bnpAssets = calculateBNP(cash, prices); // BNP  결과
const timingAssets = calculateTIMING(cash, prices); // TIMING  결과

if (bnpAssets > timingAssets) {
    console.log("BNP");
} else if (bnpAssets < timingAssets) {
    console.log("TIMING");
} else {
    console.log("SAMESAME");
}

 

 

 

 

 

 

 

 

 

 

 

 

 

'🏴알고리즘' 카테고리의 다른 글

[백준-14467] 소가 길을 건너간 이유 1  (0) 2024.11.25
'🏴알고리즘' 카테고리의 다른 글
  • [백준-14467] 소가 길을 건너간 이유 1
gprorogpfus
gprorogpfus
:- >
  • gprorogpfus
    gpfusdldks
    gprorogpfus
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 🎭JavaScript (2)
      • 👚 CSS (1)
      • ⚛️ React (13)
      • 🌃 Next.js (5)
        • 🔜 next.js-study (3)
      • 🥏TypeScript (10)
      • 🏴알고리즘 (2)
      • 🌴트러블슈팅 (3)
      • ⛲ 프로젝트 (6)
        • 👖gproro-shop-app (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    TypeScript
    react
    GIT
    Redux
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gprorogpfus
[백준-20546] 🐜 기적의 매매법 🐜
상단으로

티스토리툴바