여니의 취준 준비/코딩테스트 (Java)

[20546] 기적의 매매법 in Java

여니's 2022. 7. 29. 17:46

https://www.acmicpc.net/problem/20546

 

20546번: 🐜 기적의 매매법 🐜

1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을 출력한다. 모든 결과 따옴표를 제외하고 출력한다.

www.acmicpc.net

 


1. Scanner를 사용한 풀이

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int joon_money=sc.nextInt();
		int joon_cnt=0;
		int min_money=joon_money;
		int min_cnt=0;
		
		int[] array=new int[14];
		for(int i=0; i<14; i++) {
			array[i]=sc.nextInt();
		}
		
		for(int i=0; i<array.length; i++) {
			// 준현
			int day_money=array[i];
			joon_cnt+=joon_money/day_money; // 주식 가능한 전량매수
			joon_money%=day_money; // 주식 수 계산
			
			// 성민
			if (low(array,i)) { // 전량 매수
				min_cnt+=min_money/day_money;
				min_money%=day_money;
			}
			if(high(array,i)) { // 전량 매도
				min_money+=day_money*min_cnt;
				min_cnt=0;
			}
		}
		// 14일 마지막 날 
		joon_money+=joon_cnt*array[13];
		min_money+=min_cnt*array[13];
		
		if (joon_money>min_money) {
			System.out.println("BNP");
		}else if(joon_money < min_money) {
			System.out.println("TIMING");
		}else {
			System.out.println("SAMESAME");
		}
		
	}
	private static boolean low(int[] array, int cnt) {
		if(cnt<3) {
			return false;
		}
		return array[cnt-3]>array[cnt-2] && array[cnt-2]>array[cnt-1] && array[cnt-1]>array[cnt];
	}
	private static boolean high(int[] array,int cnt) {
		if(cnt<3) {
			return false;
		}
		return array[cnt-3]<array[cnt-2] && array[cnt-2]<array[cnt-1] && array[cnt-1]<array[cnt];
	}
}

/*
 * 준현  - 주식 팔지 않는다. 최대한 많이 산다.
 * 성민 - 33 매매법 (전량 매수, 전량 매도, 빚 내지 x)
 * 3일 연속 가격 상승 (3일째 전량 매도)
 * 3일 연속 가겨 하락 (마지막 날 전량 매수)
 * */

2. Buffer 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int money = Integer.parseInt(bufferedReader.readLine());
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        int[] array = new int[14];
        int index = 0;
        while(stringTokenizer.hasMoreTokens()){
            array[index++] = Integer.parseInt(stringTokenizer.nextToken());
        }

        int joon_money=money;
        int joon_cnt=0;
        int min_money=money;
        int min_cnt=0;

        for(int i=0; i<array.length; i++) {
            // 준현
            int day_money=array[i];
            joon_cnt+=joon_money/day_money; // 주식 가능한 전량매수
            joon_money%=day_money; // 주식 수 계산

            // 성민
            if (low(array,i)) { // 전량 매수
                min_cnt+=min_money/day_money;
                min_money%=day_money;
            }
            if(high(array,i)) { // 전량 매도
                min_money+=day_money*min_cnt;
                min_cnt=0;
            }
        }
        // 14일 마지막 날 
        joon_money+=joon_cnt*array[13];
        min_money+=min_cnt*array[13];

        if (joon_money>min_money) {
            System.out.println("BNP");
        }else if(joon_money < min_money) {
            System.out.println("TIMING");
        }else {
            System.out.println("SAMESAME");
        }
		
	}
	private static boolean low(int[] array, int cnt) {
		if(cnt<3) {
			return false;
		}
		return array[cnt-3]>array[cnt-2] && array[cnt-2]>array[cnt-1] && array[cnt-1]>array[cnt];
	}
	private static boolean high(int[] array,int cnt) {
		if(cnt<3) {
			return false;
		}
		return array[cnt-3]<array[cnt-2] && array[cnt-2]<array[cnt-1] && array[cnt-1]<array[cnt];
	}
}
/*
 * 준현  - 주식 팔지 않는다. 최대한 많이 산다.
 * 성민 - 33 매매법 (전량 매수, 전량 매도, 빚 내지 x)
 * 3일 연속 가격 상승 (3일째 전량 매도)
 * 3일 연속 가겨 하락 (마지막 날 전량 매수)
 * */