https://school.programmers.co.kr/learn/courses/30/lessons/82612
n번 이용 시 요금이 n배가 되는 놀이기구의 총 이용요금에 대해 부족한 금액 계산하기. (부족하지 않으면 0)
- 풀이 1
class Solution {
fun solution(price: Int, money: Int, count: Int): Long {
return summation(count) * price - money
}
fun summation(n: Int): Long {
var ans = n.toLong()
for (i in 1 until n) ans += i
return ans
}
}
함수로 나눌 필요가 없는데도 나뉘어 있는 이유는, 원래 tailrec을 시도했는데, 반환값에 더하기 연산이 들어가는 것을 깨닫고 수정하느라 함수로 나뉘어 작성되었다.
그냥 카운트 값을 1부터 합하여 가격을 곱하면 되는 간단한 문제다.
- 풀이 2
class Solution { fun solution(price: Int, money: Int, count: Int): Long {
val a = (1L..count).sum() * price - money
return if (a < 0) 0L else a }
}
코드를 간단히 정리하면 이렇게 된다. 반환형인 Long을 맞춰주려면 범위값부터 Long으로 해주면 전체 계산이 Long으로 들어간다.
- 참고 풀이 3
class Solution { fun solution(price: Int, money: Int, count: Int): Long =
with(count * (count + 1L) / 2 * price - money) { if (this < 0) 0 else this }
}
이러한 문제에서 성능을 가장 좋게 만드는 방법은 일반항을 적용하는 것이다. 1~n 합의 일반항은 간단하므로 이렇게 적용할 수 있다. 역시 Long으로 맞추기 위해 1을 더할 때 1L을 해주었다. 그리고 with를 적용하여 한 줄로 나타냈다.