문제 링크입니다: 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 |