문제 요약
주식을 살 수 있다면 가능한 만큼 즉시 매수 한 후 오로지 기도만 하는 BNP 전략의 준현이와 3일 연속 가격이 전일 대비 상승/하락 한다면 전량 매도/매수하는 33 매매법의 성민이가 있다.
입력 : 첫 번째 줄에 준현이와 성민이에게 주어진 현금이 주어진다. 두 번째 줄에 2021년 1월 1일부터 2021년 1월 14일까지의 MachineDuck 주가가 공백을 두고 차례대로 주어진다. 모든 입력은 1000 이하의 양의 정수이다.
출력 : 1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을 출력한다.
기존의 코드
import java.util.*;
import java.io.*;
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Integer cash = Integer.parseInt(br.readLine());
String[] stocks = br.readLine().split(" ");
Integer[] stock = new Integer[14];
for(int i = 0; i < stock.length; i++){
stock[i] = Integer.parseInt(stocks[i]);
}
if(Junhyun(cash, stock) > Sungmin(cash, stock)) System.out.println("BNP");
else if(Junhyun(cash, stock) < Sungmin(cash, stock)) System.out.println("TIMING");
else System.out.println("SAMESAME");
}
private static int Junhyun(Integer cash, Integer[] stock) {
int asset = 0; // 자산
int share = 0; // 주식 수
for(int i = 0; i < 14; i++){
if(stock[i] <= cash){ // 매입이 가능하다면
share += cash / stock[i];
cash = cash % stock[i];
}
}
asset = cash + (stock[13] * share); // 1월 14일자 자산
return asset;
}
private static int Sungmin(Integer cash, Integer[] stock) {
int asset = 0;
int share = 0;
for(int i = 3; i < 14; i++){
if (stock[i - 2] < stock[i - 1] && stock[i - 1] < stock[i] && share > 0){ // 3일 연속 주가 상승
cash += share * stock[i];
share = 0; //전량 매도
}
else if (stock[i - 2] > stock[i - 1] && stock[i - 1] > stock[i] && stock[i] <= cash){
share = cash / stock[i]; // 3일 연속 주가 하락
cash = share / stock[i]; // 전량 매수
}
}
asset = cash + (stock[13] * share);
return asset;
}
}
문제!
3일 연속 가격이 상승/하락 된다는 것의 의미 파악이 문제였다.
전일 대비이므로 총 4일자를 비교해야 하는 것이 포인트였던 것 같다.
Sungmin() 메서드의 상승/하락을 체크하는 if 문에 i-3일자의 주가 비교(stock[i - 3])도 추가하니 해결이 되었다.
맞은 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Integer cash = Integer.parseInt(br.readLine());
String[] stocks = br.readLine().split(" ");
Integer[] stock = new Integer[14];
for(int i = 0; i < stock.length; i++){
stock[i] = Integer.parseInt(stocks[i]);
}
if(Junhyun(cash, stock) > Sungmin(cash, stock)) System.out.println("BNP");
else if(Junhyun(cash, stock) < Sungmin(cash, stock)) System.out.println("TIMING");
else System.out.println("SAMESAME");
}
private static int Junhyun(Integer cash, Integer[] stock) {
int asset = 0; // 자산
int share = 0; // 주식 수
for(int i = 0; i < 14; i++){
if(stock[i] <= cash){ // 매입이 가능하다면
share += cash / stock[i];
cash = cash % stock[i];
}
}
asset = cash + (stock[13] * share); // 1월 14일자 자산
return asset;
}
private static int Sungmin(Integer cash, Integer[] stock) {
int asset = 0;
int share = 0;
////////////수정한 부분
for(int i = 3; i < 14; i++){
if (stock[i - 2] < stock[i - 1] && stock[i - 1] < stock[i] && share > 0){ // 3일 연속 주가 상승
cash += share * stock[i];
share = 0; //전량 매도
}
////////////수정한 부분
else if (stock[i - 2] > stock[i - 1] && stock[i - 1] > stock[i] && stock[i] <= cash){
share = cash / stock[i]; // 3일 연속 주가 하락
cash = share / stock[i]; // 전량 매수
}
}
asset = cash + (stock[13] * share);
return asset;
}
}
'Algorithm 👩🏻🔧' 카테고리의 다른 글
[BOJ 20529] 가장 가까운 세 사람의 심리적 거리(비둘기집 어렵지 않아요!!!!!! 초간단) (0) | 2023.07.05 |
---|---|
[프로그래머스] k 번째 수 JAVA (0) | 2023.03.20 |