알고리즘/algospot

algospot LOAN

꾸준함. 2018. 2. 26. 22:24

문제 링크입니다: https://algospot.com/judge/problem/read/LOAN

간단한 이분법 문제였습니다.

문제의 조건 3가지를 잘 이해했다면 별 문제 없이 프로그램이 동작했을 것입니다.


/*

집을 떠나 혼자 살게 된 재훈이는 회사 근처의 전세집을 알아보고 있습니다.

전세금은 N원인데, 재훈이는 이것을 연이율 P%로 대출받을 수 있습니다.

재훈이는 M개월 동안 매달 일정액 C원씩을 갚으려고 합니다.

 

대출의 잔금은 대출 기간 동안 다음과 같이 변화합니다.

ᆞ대출의 잔금은 대출 금액 N원에서 시작합니다.

ᆞ한 달이 지날 때마다 대출 잔금이 월 이자 (P/12)% 만큼 불어납니다.

ᆞ이자가 추가된 다음 월 상환액 C를 대출 잔금에서 제합니다.

 

M개월 걸려 모든 대출 금액을 갚기 위해서는 한 달에 최소 얼마씩을 갚아야 할까요?

*/

#include <iostream>

#include <iomanip>

using namespace std;

 

int Month; //Month 개월

double N, Rate; //대출금액, Rate%

 

//amount원을 연 이율 rates% duratio월 간 한 달에

//monthlyPayment로 갚았을 때 대출 잔금은?

double balance(double amount, int duration, double rates, double monthlyPayment)

{

        double balance = amount;

        for (int i = 0; i < duration; i++)

        {

               //이자가 붙는다

               balance *= (1.0 + (rates / 12.0) / 100.0);

               //상환액을 잔금에서 제한다

               balance -= monthlyPayment;

        }

        return balance;

}

 

//amount원을 연 이율 rates% duration월 간 갚으려면 한달에 얼마씩 갚아야하는가?

double payment(double amount, int duration, double rates)

{

        //불변 조건

        //1. low원씩 갚으면 duration개월 안에 갚을 수 없다

        //2. high원씩 갚으면 duration개월 안에 갚을 수 있다

        double low = 0, high = amount*(1.0 + (rates / 12.0) / 100.0);

        for (int iter = 0; iter < 100; iter++)

        {

               double mid = (low + high) / 2.0;

               if (balance(amount, duration, rates, mid) <= 0)

                       high = mid;

               else

                       low = mid;

        }

        return high;

}

 

int main(void)

{

        int test_case;

        cin >> test_case;

        if (test_case < 1 || test_case>50)

               exit(-1);

 

        for (int i = 0; i < test_case; i++)

        {

               cin >> N >> Month >> Rate;

               if (N < 1 || N>100000000 || Month < 1 || Month>120 || Rate <= 0 || Rate > 50)

                       exit(-1);

 

               cout << fixed << setprecision(10);

               cout << payment(N, Month, Rate) << endl;

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 프로그래밍 대회에서 배우는 알고리즘 문제해결전략

반응형

'알고리즘 > algospot' 카테고리의 다른 글

UVa Online Judge 10385 - Duathlon  (5) 2018.03.02
algospot RATIO  (0) 2018.02.27
algospot ROOTS  (4) 2018.02.26
algospot WITHDRAWAL  (0) 2018.02.25
algospot KAKURO1  (0) 2018.02.25