300x250
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/82612
* 버클업 5월 5째주
class Solution {
public long solution(int price, int money, int count) {
for(int i = 1; i<=count; i++){
money = money - (price * i);
}
if(money>0) {
money = 0;
}
return Math.abs(money);
}
}
이렇게 했는데 테스트케이스 19~22 통과 실패함...
질문하기 탭 둘러보니 지난주 구슬문제와 마찬가지로 int 범위를 넘어선 문제로 보임
어쩐지 return 타입이 long으로 되어있었음;;
아래 코드로 통과함
class Solution {
public long solution(int price, int money, int count) {
long answer = money; // long으로 받아서 계산
for(int i = 1; i<=count; i++){
answer = answer - (price * i);
}
if(answer>0) {
answer = 0;
}
return Math.abs(answer);
}
}
*
이러고 나서 다른사람의 풀이를 봤더니ㅠㅠ
등차수열의 합으로 진짜 간략하게 푼 솔루션이 있었다.
▶등차수열의 합 : 첫 항과 마지막 항을 더한 뒤 항의 개수를 곱하고 2로 나눈 값
for(int n = 0; n<count; n++){
price += price*n;
}
위 반복문의 결과는 아래와 같다.
price*1 + price*2 + price*3 ... price*n
= price * (1+2+3+4....n)
= price * (1+n+ 2+n-1 ... + n+1) / 2
=> price * (1+n) * n/ 2
그래서 반복문 돌릴 필요 없이 전체 이용요금은 아래처럼 나타난다!
accPrice = price * ( (count+1) * count ) / 2;
그럼 가진 돈에서 저 누적 금액을 빼기만 하면 된다.
return accPrice - money;
이렇게 하는게 코드도 간결하고 속도도 좀 더 빨랐다.
*
근데 돈이 모자라지 않으면 0을 리턴하라고 했다.
나는 이걸 조건문으로 판별했는데
다른 사람의 풀이에서는 모자라는 금액을 0과 비교하여 큰 값을 리턴하게 하고 있었다.
return Math.max(price * ( (long) count * (count + 1) / 2) - money, 0);
이 한줄이 솔루션 전체인 것이다.... 와우
300x250
반응형
'IT > 알고리즘' 카테고리의 다른 글
[프로그래머스] 피자 나눠 먹기(3), 중앙값 구하기 (0) | 2023.06.21 |
---|---|
프로그래머스 Lv.0 최댓값 만들기(2) (0) | 2023.05.24 |
LeetCode 198. House Robber (0) | 2023.05.22 |
LeetCode 70. Climbing Stairs (1) | 2023.05.22 |
LeetCode 1. Two Sum (0) | 2023.05.21 |