문제
문제 : https://www.acmicpc.net/problem/4998
상근이는 은행에 가서 통장을 만들고 N원을 저금했다. 은행은 통장을 만들지 1년이 지날 때마다 통장에 저금되어 있는 돈의 B%만큼을 이자로 적립한다. 상근이는 이 통장에 추가적인 거래를 하지 않았을 때, 몇 년이 지나야 통장에 저금되어 있는 돈이 M원을 넘을지 궁금하다.
N, M, B가 주어졌을 때 몇 년이 지나야 하는지 구하여라.
단, 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각, 테스트 케이스는 한 줄이며 N, B, M이 주어진다.
풀이
원금에 대한 이자를 연을 기죽으로 더해지는 연 복리를 계산하는 문제다. 복리 계산법은 쉽게 아래와 같이 표현할 수 있다.
즉, 이 문제는 아래 공식을 만족하는 지수 \( x \)를 구하면 된다.
$$ M \le N(1 + \frac{B}{100})^x $$
공식을 정리하면 다음과 같다.
$$ \begin{gather} \frac{M}{N} \le (1 + \frac{B}{100})^x \\ \log_{(1 + \frac{B}{100})} \frac{M}{N} \le x \end{gather} $$
이제 위 공식을 구현해보자.
구현
입력 데이터는 다음과 같이 파싱 한다.
N, B, M = map(float, sys.stdin.readline().strip().split(' '))
그리고 log 연산은 math.log 함수를 사용하여 계산할 수 있다. 첫 번째 매개변수에 진수(value)를, 두 번째 매개변수에 밑(base)을 대입한다.
math.log(M / N, (1 + B / 100))
단, 지수가 저금한 연에 해당하기 때문에 정수로 결과가 나와야 한다. 밑에 지수를 제곱한 값이 진수보다 크거나 같다는 조건을 만족해야 하므로 항상 올림으로 처리해야 하겠다.
math.ceil(math.log(M / N, (1 + B / 100)))
테스트 케이스가 여럿이기 때문에 위 계산을 반복적으로 수행하면 된다. 전체 코드는 접은글로 처리해 둔다.
import sys
import math
while True:
try:
N, B, M = map(float, sys.stdin.readline().strip().split(' '))
print(math.ceil(math.log(M / N, (1 + B / 100))))
except:
break
참고 문서
https://www.acmicpc.net/problem/4998