문제
해결 방안 고민
/*
준현이
// 한 번 산 주식은 절대 팔지 않는다.
// BNP = Buy and Pray
// 주식을 살 수 있다면 가능한 만큼 즉시 매수
// 무조건 사고 존버하는 성향
*/
/*
* 성민이 - 주식이 타이밍 싸움
33매매법
1. 전량 매수, 전량 매도로 이루어짐
=> 현금: 100원, 주가: 11원 - 99원 어치 매수
=> 빚을 내서 주식을 하지는 않음 (매수량이 현금보다 많으면 안 됨!)
2. 3일 연속 가격이 전일 대비 상승하는 주식 -> 다음 날 무조건 가격이 하락한다고 가정
- 소유 주식의 가격이 3일 상승한다면, 전량 매도 (이전 날과 다음 날을 비교했을 때 다음 날의 가격이 크다면 상승한 것으로 간주)
- 전일과 오늘의 주가가 동일하다면 가격이 하락한 것이 아님
3. 3일 연속 가격이 전일 대비 하락하는 주식 -> 다음 날 무조건 가격이 상승한다고 가정
- 소유 주식의 가격이 3일 하락한다면, 전량 매수 (이전 날과 다음 날을 비교했을 때 다음 날의 가격이 작다면 하락한 것으로 간주)
*/
// 준현이, 성민이는 각자의 매매법 중 어떤 방법이 더 수익률이 높은지 겨뤄봄
// 내기 기간: 2021. 1. 1 ~ 2021. 1. 14
// 2021. 1. 14일에 더 많은 자산을 보유한 사람이 승리
// 1월 14일 자산 = 현금 + (1/14일 주가 x 주식 수)
// == 출력 결과 ==
// 준현이의 자산이 더 크다 : BNP
// 성민이의 자산이 더 크다 : TIMING
// 둘의 자산이 같다 : SAMESAME
Java
복사
해결 방법
•
그리디를 활용하여 남은 현금과 보유 주식 수를 구한다.
•
준현이, 성민이의 현금 변수를 따로 생성하여 각 사람의 남은 현금과 보유 주식 수를 계산한다.
코드
package algo250202;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int cash = Integer.parseInt(br.readLine());
// 14일 간의 주가 입력
int[] stockPrice = new int[14];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < 14; i++) {
stockPrice[i] = Integer.parseInt(st.nextToken());
}
// 준현이의 계산법 - 몫, 나머지로 계산
// 성민이의 계산법 내용이 담긴 로직 구현 (2가지를 구현)
int money1 = cash; // 남은 현금
int stock1 = 0; // 보유 주식 수
for (int i = 0; i < 14; i++) {
// 준현
if (money1 / stockPrice[i] > 0) {
int count = money1 / stockPrice[i];
stock1 += count;
money1 -= stockPrice[i] * count;
if (money1 == 0) {
break;
}
}
}
int money2 = cash; // 남은 현금
int stock2 = 0; // 보유 주식 수
for (int i = 0; i < 11; i++) {
// 성민 3일 연속 가격이 전일 대비 상승한다면, 전량 매도
if ((stockPrice[i] < stockPrice[i + 1]) && (stockPrice[i + 1] < stockPrice[i + 2])) { // 상승
if (stock2 == 0) {
continue;
}
money2 += stockPrice[i + 3] * stock2;
stock2 = 0;
} else if ((stockPrice[i] > stockPrice[i + 1]) && (stockPrice[i + 1] > stockPrice[i + 2])) {
// 3일 연속 가격이 전일 대비 하락한다면, 전량 매수
if (money2 / stockPrice[i + 3] > 0) {
int count = money2 / stockPrice[i + 3];
stock2 += count;
money2 -= stockPrice[i + 3] * count;
}
}
}
// 준현이의 자산이 더 크면 : BNP
// 성민이의 자산이 더 크면 : TIMING
// 둘의 자산이 같으면 : SAMESAME
int profit1 = money1 + stockPrice[stockPrice.length - 1] * stock1;
int profit2 = money2 + stockPrice[stockPrice.length - 1] * stock2;
if (profit1 > profit2) {
bw.write("BNP");
} else if (profit1 < profit2) {
bw.write("TIMING");
} else {
bw.write("SAMESAME");
}
bw.flush();
bw.close();
}
}
Java
복사