https://www.acmicpc.net/problem/20546
const input = require('fs')
.readFileSync(process.platform === 'linux' ? '/dev/stdin' : './data.txt')
.toString()
.split('\n');
const money = parseInt(input[0]);
const arr = input[1].split(" ").map(Number);
const result = junCalculate(money, arr);
const result2 = seongCalculate(money, arr);
if (result > result2) {
console.log("BNP");
} else if (result < result2) {
console.log("TIMING");
} else {
console.log("SAMESAME");
}
function junCalculate(money, arr) {
let stockNum = 0;
let lastStockPrice = arr[arr.length - 1];
for(let i=0; i<arr.length; i++) {
//현금이 주가보다 많거나 같으면
if(money >= arr[i]) {
stockNum += Math.floor(money / arr[i]); //주식 수 상승
money = money % arr[i]; //현금 차감
}
}
return money + lastStockPrice * stockNum;
}
function seongCalculate(money, arr) {
let stockNum = 0;
let lastStockPrice = arr[arr.length - 1];
let ascDesc = 0;
let descCount = 0;
for(let i=1; i<arr.length; i++) {
//가격이 같다면 계산 x
if(arr[i-1] == arr[i]) {
continue;
}
//주가 상승
if(arr[i-1] < arr[i]) {
ascDesc++;
descCount=0;
}
//주가 하락
if(arr[i-1] > arr[i]) {
descCount++;
ascDesc=0;
}
//매도(판매)
if(ascDesc >= 3) {
money += stockNum * arr[i];
stockNum = 0;
}
//매수(구매)
if(descCount >= 3) {
if(money >= arr[i]){
stockNum += Math.floor(money / arr[i]);
money = money % arr[i];
}
}
}
return money + lastStockPrice * stockNum;
}
준현, 성민의 돈을 각각 계산하기 위해서 두 메소드로 분리했다.
준현이의 경우 주가가 현금보다 낮으면 풀매수를 때리면 되기 때문에 간단한데, 성민이에서 살짝 애를 먹었다.
살짝 고민을 하다보니 상승, 하락에 대한 카운트가 필요했고
const money = parseInt(input[0]);
여기서 첫 제출시에는 parseInt를 사용하지 않아서 문자열로 인식하여 현금이 100이 아니라 1000이 되는 상황이 됐었다.
주가가 3연속 하락하면 매수 후 하락카운트를 바로 초기화 시켜줬는데 그게 아니었다. 현금이 남았고 다음날 또 주가가 하락한다면 사야하기 때문에 초기화 하는 부분을 없애줬다.
아무튼 해결!