IT/알고리즘

프로그래머스 Lv.1 부족한 금액 계산하기

thesse 2023. 5. 24. 22:03
300x250
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/82612

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

* 버클업 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
반응형