12. 부족한 금액 계산하기

김영민·2022년 1월 28일
0

문제📃

1. 문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다.
이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다.
즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

2. 제한 조건

놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

3.입출력 예

pricemoneycountresult
320410

4.입출력 예 설명

이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면,
총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.


풀이

나의 정답1👨‍💻

public class CountLackMoney {	

    // 세 개의 매개변수가 두 개의 긴 정수 그리고 하나의 정수로 이루어져 있으며,
    // 리턴값으로 긴 정수를 돌려주는 메소드
    // 위에 price는 1원에서 2,500원 사이라고 정의했기 때문에 int를 줘도 될 것 같지만,
    // 횟수가 늘어나 총 가격이 커지면 int 범위를 벗어날 수 있기 때문에 long 필드를 부여해야 함 
    public long solution1(long price, long money, int count) {            
        long answer = 0;
        long countSum = 0;
        
        // 반복문을 통해 놀이기구를 탄 횟수까지의 총합을 구함
        for (int i = 1; i <= count; i++) {
        
            // count += i를 쓰면 안됨
            // 위의 식을 사용하게되면 놀이기구를 탄 횟수가 3번이었을 때 적용되는 계산은 
            // count = 3 + 1 = 4  ->  count = 4 + 2 = 6  ->  count = 6 + 3 = 9이 됨
            
            // 따라서 초기화된 값이 0인 변수를 새로 선언해야 함
            countSum += i;            
        }

        // price에 countSum을 곱하여 놀이기구를 타는데 들어가는 총 금액을 구함
        price = price * countSum;
        
        // 놀이기구를 타는데 들어가는 총 금액에서 가지고 있는 금액을 차감하여 answer 값을 구함 
        answer = price - money;
        
        // 가지고 있는 금액이 부족하지 않으면 0을 리턴하라고 했기 때문에
        // 놀이기구 총 금액이 가지고 있는 금액보다 크다면
        if (price>money){
            // answer를 돌려주고,
            return answer;
            
        // 그렇지 않다면, 즉, 가지고 있는 금액이 놀이기구 총 금액보다 크거나 같다면,    
        } else {
            // 리턴값에 0을 부여
            return 0;
        }	
    }

나의 정답2👨‍💻

    public long solution2(long price, long money, int count) {
    // 두 정수 사이의 합(SumBtwTwoInt)의 심화정답에서
    // 등차수열의 합공식을 이용했던 것이 생각나 적용해봄
    
        // 등차수열의 합공식(b > a라면) : (b - a + 1) * (a + b) / 2
        
        // 1부터 count의 값까지 더해야 하기 때문에 count의 값이 1보다 작을 수는 없음
        // 등차수열의 합공식에 이 내용을 대입하면 (count - 1 + 1) * (1 + count)/2
        // 위 대입한 식을 정리하면 아래와 같이 나옴
        price = price * ((count) * (count + 1) / 2);
        if(price > money) {
            long answer = price - money;
            return answer;
        } else {
            return 0;
        }
    }

심화정답 🏆

    public long solution3(long price, long money, long count) {
    // 놀이기구를 타는데 들어가는 총 금액이 가지고 있는 금액보다 작으면
    // 위의 answer값은 음수가 나오기 때문에,
    // 최대값을 도출해주는 함수를 이용하여 부족한 금액과 0 중에서 더 큰 값을 도출		 
        return Math.max(price * (count * (count + 1) / 2) - money, 0);
    }

테스트용 코드🎯

    public static void main (String[] args) {
        CountLackMoney countlackmony = new CountLackMoney();		
		
        System.out.println(countlackmony.solution1(3, 20, 4)); // 10 출력
        System.out.println(countlackmony.solution1(3, 30, 4)); // 0 출력
        System.out.println(countlackmony.solution1(3, 70, 4)); // 0 출력
		
        System.out.println(countlackmony.solution2(3, 20, 4)); // 10 출력
        System.out.println(countlackmony.solution2(3, 30, 4)); // 0 출력
        System.out.println(countlackmony.solution2(3, 70, 4)); // 0 출력
		
        System.out.println(countlackmony.solution3(3, 20, 4)); // 10 출력
        System.out.println(countlackmony.solution3(3, 30, 4)); // 0 출력
        System.out.println(countlackmony.solution3(3, 70, 4)); // 0 출력
    }
}
profile
Macro Developer

0개의 댓글