프로그래머스 위클리 챌린지 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);
}
}
'찌끄레기 개발자 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 위클리 챌린지 8주차 (0) | 2021.10.02 |
---|---|
[Java] 프로그래머스 위클리 챌린지 2주차 (0) | 2021.10.02 |