문제 정의
원금 amt > 0을 2021년 1월 1일에 예금하고, 연 이자율 p%를 360으로 나눈 만큼 매일 이자가 붙는다고 가정해 보겠습니다. 우리의 목표는 원금과 누적 이자의 합계가 원하는 금액 a0 이상이 되는 시점을 찾는 것입니다.
따라서 함수는 원금, 목표 금액, 연 이자율이라는 세 가지 매개변수를 받아, 금액이 목표치에 도달하는 날짜를 반환해야 합니다.
접근 방법
이 문제는 복리(compound interest) 방식으로 계산해야 합니다. 매일 발생한 이자가 다시 원금에 합쳐지고, 그 금액을 기준으로 다음 날 이자가 계산되기 때문입니다.
핵심 로직은 다음과 같이 정리할 수 있습니다.
- 연 이자율을 일 이자율로 변환합니다. 퍼센트 값을 소수로 바꾸고 360으로 나누면 되므로
interest / 36000이 됩니다. while반복문으로 하루씩 진행하며, 현재 금액에 일 이자율을 곱한 이자를 계속 더합니다.- 현재 금액이 목표 금액 이상이 되면 반복을 종료하고, 경과한 일수를 시작 날짜에 더해 최종 날짜를 구합니다.
코드 구현
다음은 전체 코드입니다.
const principal = 100;
const amount = 150;
const interest = 2;
const findDate = (principal, amount, interest) => {
const startingDate = new Date('2021-01-01')
const dailyInterestRate = interest / 36000
let startingMoney = principal
let daysPassed = 0
while (startingMoney < amount) {
daysPassed++
startingMoney += startingMoney * dailyInterestRate
};
startingDate.setDate(startingDate.getDate() + daysPassed)
return startingDate.toISOString().split('T')[0]
};
console.log(findDate(principal, amount, interest));
코드 설명
- 초기 설정: 시작 날짜를 2021년 1월 1일로 지정하고, 연 이자율 2%를 일 이자율로 변환합니다.
interest / 36000은(2 / 100) / 360과 같은 의미입니다. - 반복 계산: 현재 금액이 목표 금액보다 작은 동안 경과 일수를 1씩 늘리고, 금액에 일 이자율을 곱한 이자를 더해 복리 효과를 반영합니다.
- 날짜 산출: 경과 일수만큼 시작 날짜에 더한 뒤,
toISOString()으로 ISO 형식 문자열을 만들고'T'를 기준으로 분리해YYYY-MM-DD형태의 날짜만 반환합니다.
실행 결과
2040-12-26
원금 100을 연 이자율 2%로 일 단위 복리 적용하면 약 7,300일, 즉 약 20년이 지나야 150에 도달합니다. 그래서 결과가 2040년 12월 26일로 출력되는 것입니다. 이처럼 반복문과 Date 객체를 조합하면 복리 예금의 목표 달성 시점을 손쉽게 계산할 수 있습니다.