프로그래머스 부족한 금액 계산하기
문제
놀이기구의 기본 이용료가 price인데, i번째로 탈 때는 price × i만큼을 낸다. 소지금이 money일 때 count번 타면 돈이 얼마나 부족한지를 구하면 된다(부족하지 않으면 0).
- 입력:
price(이용료),money(소지금),count(이용 횟수). - 출력: 부족한 금액. 충분하면
0. - 제한: 값이 커서 총액이
int범위를 넘을 수 있으니long long으로 계산해야 한다.
접근
count번 탈 때 총액은 price·1 + price·2 + … + price·count 이다. 이건 등차수열의 합이라 반복문 없이 공식으로 한 번에 구할 수 있다.
총액 = price × (1 + 2 + … + count) = price × count(count+1)/2
총액에서 소지금을 빼서 부족분을 내면 되는데, 한 가지 함정 — 중간 계산을 int로 하면 오버플로가 난다(count와 price가 크면 곱이 21억을 넘는다). 그래서 long long으로 캐스팅한 채 계산해야 한다.
풀이
전체 코드: thxwelchs/algorithm
#include <bits/stdc++.h>
using namespace std;
// 위클리 챌린지 1주차 부족한 금액 계산하기
// https://programmers.co.kr/learn/courses/30/lessons/82612
long long solution(int price, int money, int count) {
// 등비수열의 합으로 구하기 (공비는 price이고 항 갯수는 count)
// 캐스팅 안해주면 overflow가 난채로 totalPay 변수에 값이 대입되어 입력범위에 따라 정답처리가 되지 않는다.
// 여기서 최대 범위는 아마도 count ^ 2 * price 정도가 될 것인데,
// 2500 ^ 3 만 해보더라도 int의 최대범위를 넘어간다.
long long totalPay = ((long long) (price + (count * price))) * count / 2;
return money >= totalPay ? 0 : (long long) (totalPay - money);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cout << solution(3, 20 , 4);
return 0;
}
댓글
GitHub(giscus) 댓글은 설정 완료 후 활성화됩니다.