본문 바로가기

찌끄레기 개발자/프로그래머스

[Java] 프로그래머스 위클리 챌린지 1주차

 

프로그래머스 위클리 챌린지 1주차에는 이런 문제가 나왔습니다.

사실 이 문제는 난이도가 상당히 낮기 때문에

어떻게 가든 서울만 가자 라는 생각으로 푸신다면 못 풀 확률은 거의 없다고 생각됩니다

저도 그런 생각으로 풀었는데 좋은 방법으로 푸신 다른 분이 있어서

그 분에 빙의해서 풀어볼까 합니다.


 

1. price원의 놀이기구를 N번 이용했을 때 총 이용료 구하기

총 이용료는 price * 1 + price * 2 + price * 3 + ··· + price * N 이 됩니다

이때 price로 묶어주게되면 price * (1 + 2 + 3 + ··· + N) 이 되고

밑줄친 부분을 등차수열의 합 공식으로 구하면

등차수열의 합

첫 항의 값 a = 1, 항의 갯수 n = N, 마지막 항의 값 l = N이므로 아래와 같이 총 이용료를 구할 수 있습니다

price * (N * (N + 1) / 2)

 

2. 얼마가 모자라는지 구하기

금액이 부족하다면 얼마가 부족한지, 부족하지 않다면 0을 리턴해야합니다

단순히 구하면 (총 이용료) > (처음 가지고 있던 금액) ? (총 이용료) - (처음 가지고 있던 금액) : 0

을 리턴하면 되지만

다르게 생각해보면 (총 이용료) - (처음 가지고 있던 금액) 과 0 중에 더 큰 값을 리턴하는 방법도 있습니다

 

따라서 더 큰 값을 구하는 함수인 Math.max를 이용해도 되겠습니다

 

3. 고려해야할 케이스

항상 코딩테스트 문제는 생각지 못한 케이스가 있으면 애를 먹습니다.

위 문제에서 price와 count가 최대일 때는 각각 2500일 때입니다.

위의 방법으로 구하거나 혹은 총 이용료를 저장하게 되면

int형의 범위를 벗어나는 케이스가 발생하게 됩니다

넉넉한 크기의 데이터타입이 필요합니다

 

4. 최종 코드

class Solution {

    public long solution(long price, long money, long count) {

        return Math.max(price * (count * (count + 1) / 2) - money, 0);

    }

}

반응형