Backend
home
🧮

[백준] 기적의 매매법

생성일
2025/02/02 07:49
태그
BaekJoon
게시일
2025/02/02
최종 편집 일시
2025/02/03 02:43

문제

해결 방안 고민

/* 준현이 // 한 번 산 주식은 절대 팔지 않는다. // 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
복사