https://www.acmicpc.net/problem/20546
문제 요약
- 목표: 두 투자자, 준현이와 성민이의 투자 전략 중 어떤 것이 더 높은 수익률을 내는지 비교한다.
- 제공 정보:
- 초기 현금
- 14일 동안 매일 변하는 주식 가격 리스트
- 투자 전략:
- 준현이의 "BNP" 전략:
- 주식을 살 수 있으면 최대한 많이 산다.
- 한 번 산 주식은 절대 팔지 않는다.
- 성민이의 "TIMING" 전략:
- 주식 가격이 3일 연속 상승하면 보유 주식을 전부 판다.
- 주식 가격이 3일 연속 하락하면 보유 현금으로 최대한 많이 산다.
- 준현이의 "BNP" 전략:
- 결과 계산:
- 14일째 (마지막 날) 각자의 총 자산을 계산합니다.
- 자산 = 남은 현금 + (보유 주식 수 × 마지막 날 주식 가격)
문제를 풀기 위한 가정
- 투자 제한:
- 주식을 매수할 때는 가진 돈으로만 사고, 빚을 내지 않습니다.
- 주식을 매도할 때는 현재 보유한 주식만 팔 수 있습니다.
- 자산 계산:
- 자산은 항상 현금 + (보유 주식 × 현재 주가)로 계산합니다.
- 승자 결정:
- 준현이의 자산이 더 크면 "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];
}
- 주식을 살 수 있으면 가능한 만큼 사고, 남은 현금은 그대로 유지합니다.
- 주식을 판다는 개념이 없으므로, 마지막 날까지 보유 주식 수는 계속 누적됩니다.
- 자산 계산:
- 남은 현금 + (보유 주식 × 마지막 날 주식 가격).
예시:
- 첫날 주식 가격: 10, 초기 현금: 100
- 매수 가능한 주식: Math.floor(100 / 10) = 10
- 보유 주식: 10, 남은 현금: 0.
- 이후 가격이 올라가도 더 이상 살 수 없음.
- 마지막 날(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일 연속 하락: 주식 가격이 다음 날 상승한다고 가정하고 모든 현금으로 매수합니다.
- 주식 가격이 변동 없으면 상승/하락 카운트를 초기화합니다.
예시:
- 3일 연속 상승 (주가: 10 → 20 → 23 → 34):
- 4일째 전량 매도.
- 3일 연속 하락 (주가: 30 → 22 → 19 → 12):
- 8일째 전량 매수.
- 마지막 날 자산 계산:
- 남은 현금 + (보유 주식 × 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 |
---|