[BAEKJOON] 백준 19947: 투자의 귀재 배주형 (C#)

2024. 6. 14. 02:36IT/BaekJoon

문제 링크

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

 

 

문제

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는 정수

 

 

 

통과한 답안

namespace _19947
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int H = int.Parse(inputs[0]);
            int Y = int.Parse(inputs[1]);

            int[] dp = new int[Y + 1];
            dp[0] = H;

            for (int i = 1; i <= Y; i++)
            {
                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));
                }
            }

            Console.WriteLine(dp[Y]);
        }
    }
}

 

초기 자금과 투자 기간이 주어질 때 3가지 투자 방법을 적절히 사용하여

최대의 이익을 얻는 경우의 최종 총 자산을 출력하는 문제이다.

 

문제에서 주어진 조건은 1년마다, 3년마다, 5년마다 이율을 얻을 수 있는 경우가 있고

해당 기한을 채워야지만 이율을 받을 수 있으며 투자 방식은 매년 바꿀 수 있다.

또, 이율은 소수점 이하를 버림해서 받는다는 조건이 있다.

 

투자 방식을 매년 바꿀 수 있다는 조건이 있기 때문에 이 문제는 DP를 이용해서 풀면 좋은데

Y년까지 코드를 진행하면서 매년 5%의 이율을 받는 방식으로 dp[i]를 작성하고

3년마다 20%의 이율을 받는 방식과 3년 동안 5%의 이율을 받는 방식 중 큰 값을 채택하고

5년도 같은 방식으로 더 이율을 받을 수 있는 방법을 채택하는 방식으로 작동하게 구현했다.