프로그래머스에서 위클리 챌린지를 한다는 메일을 받았다. 상품을 노린 건 아니지만 매주 문제 고르는 고민 없이 새로운 한 문제를 풀어볼 수 있을 거 같아서 시작했다. 근데 일주차라 그런지 너무 간단해서 조금 당황했다 ㅎㅎ 친구랑 알고리즘 문제풀이 벌금 스터디중인데 이거는 풀었다고 하기도 양심에 찔리지만 앞으로 챌린지 문제들이 어려워지겠지 기대하며 ! 오늘은 1주차 문제 !!
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
price | money | count | result |
---|---|---|---|
3 | 20 | 4 | 10 |
문제는 간단합니다 ! price에 1부터 count까지 곲한 값을 모두 더한 값이 놀이기구를 타는 데에 드는 총 비용이므로 이 비용에 내가 가진 돈을 뺀 값이 모자른 금액의 값이다. 만일 뺀 값이 0보다 작거나 같다면 돈이 부족하지 않은 것이다 !
사실 그대로 구현하면 되는데, 그나마 효율적으로 하려면 각각 곲하는 것이 아닌 1-count를 더한 값을 구하고 price는 한 번만 곱하는 것이다. 또한 1-count까지의 합을 구하는 것은 for문을 사용하지 않고 식을 이용해주었다.
다른 사람들의 풀이를 보니 대부분 비슷했고, 그나마 개선점을 찾아보면 최종 반환값에 if문이 아닌 Max를 쓴 사람들도 있었다. 이건 효율성도 가독성도 그닥 차이를 못 느끼겠어서 따로 수정 제출하지는 않았다 ! 끄읕 - 다음주에는 조금 더 재밌는 문제가 출제되면 좋겠다 !
class Solution {
public long sumTo(int num){
return num*(num+1)/2;
}
public long solution(int price, int money, int count) {
long result = (sumTo(count)*price) - money;
if(result < 0) return 0;
else return result;
}
}
위클리 챌린지이~~?