본문 바로가기
Algorythms

백준 19947번 투자의 귀재 배주형 java 풀이

by 준형코딩 2024. 1. 17.

문제

2020년에 학교로 복학한 주형이는 월세를 마련하기 위해서 군 적금을 깨고 복리 투자를 하려고 한다.

주형이가 하려는 투자에는 3가지 방법의 투자 방식이 있다. 

  • 1년마다 5%의 이율을 얻는 투자 (A)
  • 3년마다 20%의 이율을 얻는 투자 (B)
  • 5년마다 35%의 이율을 얻는 투자 (C)

투자를 할 때에는 다음과 같은 주의점이 있다.

  • 투자의 기한(1년, 3년, 5년)을 채우는 시점에 이율이 반영되며, 그 사이에는 돈이 늘어나지 않는다.
  • 투자 방식은 매년 바꿀 수 있다.
  • 매번 이율은 소수점 이하를 버림 해서 받는다.

예를 들어서, 지금 가진 돈이 11111원이면, A 방식이면 1년 후에 555원, B 방식이면 3년 후에 2,222원, C 방식이면 5년 후에 3,888원을 이자로 받을 수 있다. 만약 C 방식으로 투자했지만 4년이 지난 시점이라면 받을 수 있는 이자는 0원이다.

주형이의 초기 비용이 H원일 때, Y년이 지난 시점에 가장 많은 금액을 얻을 수 있는 투자 패턴을 분석하고 그 금액을 출력하자.

입력

첫째 줄에 초기 비용 H와 투자 기간 Y가 주어진다.

모든 입력은 정수로 주어진다.

출력

가장 많은 이득을 얻었을 때의 총 자산을 소수점을 모두 버리고 정수로 출력한다.

제한

  • 10,000 ≤ H ≤ 100,000, H는 정수
  • 0 ≤ Y ≤ 10, Y는 정수

예제 입력 1 복사

95229 3

예제 출력 1 복사

114274

예제 입력 2 복사

25542 10

예제 출력 2 복사

46549

 

 

백준 랜덤 디펜스를 시작했다.

티어를 안 보고 문제를 푼건 처음인 것 같다.

문제를 풀기 시작했을 때는 간단한 구현문제인 줄 알았는데 끝나고 풀이를 참고하니 DP 문제였다.

기존 구현 코드는  20%에서 계속 에러가 났다. 문제는 가장 최적의 곱하기를 해야 하는데 그러지 못해서 틀렸다.

 

- 기존 java 풀이

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;


public class Main {


    static int h, y;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        h = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());

//        System.out.println(calculateA());
//        System.out.println(calculateB());
//        System.out.println(calculateC());

        while (y > 0) {

            if (y / 5 > 0) {
                calculateC();
                continue;
            }
            if (y / 3 > 0) {
                calculateB();
                continue;
            }
            calculateA();
        }

        System.out.println(h);


    }

    private static void calculateA() {
        h += h * 0.05;
        y -= 1;
        System.out.println("1");
    }

    private static void calculateB() {
        h += h * 0.2;
        y -= 3;
        System.out.println("3");
    }

    private static void calculateC() {
        h += h * 0.35;
        y -= 5;
        System.out.println("5");
    }
}


 

 

- 참고 후 DP를 이용한 java 풀이

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;


public class Main {


    static int h, y;


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        h = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());

        int[] dp = new int[y + 1];

        dp[0] = h;

        for (int i = 1; i <= y; i++) {
            dp[i] = Math.max(dp[i], (int) (dp[i - 1] * 1.05));
            if (i >= 3) {
                dp[i] = Math.max(dp[i], (int) (dp[i - 3] * 1.2));
            }
            if (i >= 5) {
                dp[i] = Math.max(dp[i], (int) (dp[i - 5] * 1.35));
            }
        }

        System.out.println(dp[y]);


    }


}