Algorithm/백준

[백준] 4998 - 저금

비번변경 2025. 1. 7. 00:20

문제

문제 : 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