algospot : https://algospot.com/judge/problem/read/LOAN

github : https://github.com/junho0956/Algorithm/blob/master/algospot%20LOAN/algospot%20LOAN/%EC%86%8C%EC%8A%A4.cpp

 

algospot LOAN 문제입니다.

이분법을 이용하였으며, 초기 이분법 값을 잡아주는 방법과 대출 잔금을 계산하는 방법을 알고 계신다면

해결할 수 있습니다.

 

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
68
69
70
71
72
73
74
75
/*
집을 떠나 혼자 살게 된 재훈이는 회사 근처의 전세집을 알아보고 있습니다.
전세금은 N원인데, 재훈이는 이것을 연이율 P%로 대출받을 수 있습니다.
재훈이는 M개월 동안 매달 일정액 C원씩을 갚으려고 합니다.
 
대출의 잔금은 대출 기간 동안 다음과 같이 변화합니다.
 
ᆞ대출의 잔금은 대출 금액 N원에서 시작합니다.
ᆞ한 달이 지날 때마다 대출 잔금이 월 이자 (P/12)% 만큼 불어납니다.
ᆞ이자가 추가된 다음 월 상환액 C를 대출 잔금에서 제합니다.
M개월 걸려 모든 대출 금액을 갚기 위해서는 한 달에 최소 얼마씩을 갚아야 할까요?
*/
 
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
// 매달 C원씩 갚았을 때 남게 되는 대출 잔금을 반환합니다.
 
double balance(double money, int month, double rates, double C) {
    for (int i = 0; i < month; i++) {
        money *= (1 + (rates / 12 / 100));
        money -= C;
    }
    return money;
}
 
// 한달에 갚아야 하는 최소 금액을 반환합니다
double payment(double money, int month, double rates) {
    double lo = 0;
    double hi = money * (1 + (rates / 12 / 100));
 
    for (int i = 0; i < 100; i++) {
        double mid = (lo + hi) / 2;
        if (balance(money, month, rates, mid) <= 0) {
            hi = mid;
        }
        else {
            lo = mid;
        }
    }
 
    return hi;
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
 
    /*
    입력의 첫 줄에는 테스트 케이스의 수 T(<= 50)가 주어집니다.
    각 테스트 케이스는 3개의 수 N, M, P(1 <= N <= 100,000,000, 1 <= M <= 120, 0 < P <= 50)으로 주어집니다.
    N과 P는 실수이며, M은 정수입니다.
    */
 
    int T; cin >> T;
    while (T--) {
        // N : 대출금액
        // M : M개월
        // P : 연이율
        double N, P;
        int M;
        cin >> N >> M >> P;
 
        /*
        각 테스트 케이스마다 한 줄에 한 달마다 상환할 금액 C를 출력합니다.
        10-7 이하의 절대/상대 오차가 있는 답은 정답으로 인정됩니다.
        */
        cout << fixed;
        cout.precision(10);
        cout << payment(N, M, P) << endl;
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > algospot' 카테고리의 다른 글

algospot PASS486  (0) 2020.02.27
algospot FOSSIL  (0) 2020.02.26
algospot RATIO  (0) 2020.02.25
algospot ROOTS  (0) 2020.02.24
algospot FESTIVAL  (0) 2019.10.27

+ Recent posts