부족한 금액 계산하기

jericho·2023년 12월 19일

PS(문제풀이)

목록 보기
9/12

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를 적용하여 한 줄로 나타냈다.

0개의 댓글