반응형
https://programmers.co.kr/learn/courses/30/lessons/82612?language=java
조금만 생각하면 해당 문제는 등차수열의 합을 이용하여 계산할 수 있다.
- 요금 + 요금*2 + 요금*3 .... 요금*n
- 등차수열의 합 공식
a : 첫째항, l : 끝항, n : 개수
n * (a +l) / 2 - 횟수에 따른 전체 내어야 할 요금
price*(1+count)*count/2
계산은 단순할지 모르나 이렇게만 하면 테스트케이스에서 오류가 발생하게 된다.
여기서 추가적으로 더 알아야 할 문제가 있는데
- 초기 입력값에 대한 Validation
- 큰 수에 대한 처리 (int의 범위를 넘어설때)
위 사항은 어느 알고리즘 기반의 테스트를 하더라도 다 확인해야 할 문제이다.
초기 입력값 확인은 아래와 같이 별도 처리를 하면 되고, 큰 수의 경우 long으로 처리될 수 있도록 수식을 작성하면 된다.
아래는 정답 예시
Stream을 이용해서 sum을 구할순 있으나 성능이 떨어짐.
public class WeeklyChallange08_1 {
public static void main(String[] args) {
int price = 2500;
int money = 1;
int count = 2500;
long insufficienMoney = new WeeklyChallange08_1().solution(price, money, count);
System.out.println("insufficienMoney > "+insufficienMoney);
}
public long solution(int price, int money, int count) {
if(price < 1 || price > 2500) {return -1;}
if(money < 1 || money > 1000000000) {return -1;}
if(count < 1 || count > 2500) {return -1;}
// 등차수열의 합
long insufficientMoney = money-(price*(1L+count)*count/2L);
//long insufficientMoney = money - (price * LongStream.rangeClosed(1, count).sum());
return insufficientMoney>0?0:Math.abs(insufficientMoney);
}
}
반응형
'IT Tech > Dev-Practice' 카테고리의 다른 글
[java] 피보나치 수열 구현 (0) | 2020.10.02 |
---|