코테/백준

[백준/JAVA] 20546번: 🐜 기적의 매매법 🐜

imname1am 2023. 12. 11. 16:29
반응형

🔺 문제

 

20546번: 🐜 기적의 매매법 🐜

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

www.acmicpc.net

 

 

🧩  해결 아이디어

• 구현

  1. [준현] 그리디를 활용해 남은 현금과 보유 주식 수를 구한다.
  2. [성민]
    • 3일 연속 가격이 전일 대비 상승 시, 그 다음 날에 다 판다. (전량 매수)
    •                           "                하락 시, 그 다음 날에 다 산다. (전량 매도)
  3. 둘 중 누가 더 높은 수익률을 내는지 계산하고, 비교해 정답을 출력한다.
    수익률 계산 : 최종 보유 현금 + 1.14 주가 * 최종 보유 주식 수

 

 

💥 유의사항

3일 연속 상승세/하락세인 경우, 3일째 되는 날에 거래를 진행하는 것이 아니라,

그 다음 날인 넷째 날 거래를 체결해야 한다.

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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));
        StringTokenizer st;
 
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[14];
        st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < 14 ; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
 
        // [준현]
        int money1 = N; // 남은 현금
        int stock1 = 0// 보유 주식 수
 
        // 최대한 많이 사 -> 그리디
        for(int i = 0 ; i < arr.length ; i++) {
            if(money1 / arr[i] > 0) {
                int cnt = money1 / arr[i];
                stock1 += cnt;
                money1 -= arr[i] * cnt;
            }
        }
 
 
        // [성민]
        int money2 = N; // 남은 현금
        int stock2 = 0// 보유 주식 수
 
        for(int i = 0 ; i < arr.length - 3 ; i++) {
            // 3일 연속 가격이 전일 대비 상승한다면, 다 팔아 (전량 매도)
            if((arr[i] < arr[i + 1]) && (arr[i + 1< arr[i + 2])) {
                if(stock2 == 0continue;
 
                money2 += arr[i + 3* stock2;
                stock2 = 0;
            }
            // 3일 연속 가격이 전일 대비 하락한다면, 즉시 다 사 (전량 매수)
            else if((arr[i] > arr[i + 1]) && (arr[i + 1> arr[i + 2])) {
                if(money2 / arr[i + 3> 0) {
                    int cnt = money2 / arr[i + 3];
                    stock2 += cnt;
                    money2 -= arr[i + 3* cnt;
                }
            }
        }
 
        // 둘 중 누가 더 높은 수익률 내는지 (보유 현금 + 1.14 주가 * 주식 수)
        int profit1 = money1 + arr[arr.length - 1* stock1;
        int profit2 = money2 + arr[arr.length - 1* stock2;
 
        if(profit1 > profit2) {
            System.out.println("BNP");
        }
        else if(profit1 < profit2) {
            System.out.println("TIMING");
        }
        else {
            System.out.println("SAMESAME");
        }
    }
}
 
cs

 


🔺 다른 풀이들

- 객체에 (보유 현금, 보유 주식 수)를 저장해 활용하셨다.

 

백준 20546 🐜기적의 매매법🐜 (JAVA)

문제 https://www.acmicpc.net/problem/20546 20546번: 🐜 기적의 매매법 🐜 1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을

goto-pangyo.tistory.com

 

 

 

- 주식이 상승/하락할 때마다 upCnt/DownCnt에 1씩 더하며 상승세인지 하락세인지 파악해 풀기도 하셨다.

 

백준 20546번 : 기적의 매매법 | 자바 풀이

Solution 문제가 굉장히 길지만,, 원리는 단순하다준현이는 돈이 있으면 무조건 최대한 많이 사고성민이는 3일 연속 오르면 다음날 떨어질 것이라고 생각하고 가지고 있는 걸 모두 팔고,3일 연속

velog.io


💬 느낀 점

더 집중했다면 빨리 풀 수 있었을 것 같다,,

담엔 스탑워치 말고 타이머로 시간 재서 더 빠르게 풀 수 있게 해야지,,

 

 

1회독 2회독 3회독 4회독 5회독
V        
반응형