TIL231219 D22 미적미적..

jericho·2023년 12월 19일

TIL

목록 보기
22/62

뭔가 집중이 안되었던 하루였다..
어제 과제를 거의 다 만들어놓았으니 오늘은 덜 된 부분을 마저 만들고 손보면 거의 끝나는 일정이었다. 그런데 오늘따라 왜이리 코드가 안읽히는지. 계속 쳐다는 보고 있는데, 내용이 전혀 머릿속에 들어오지 않는다. 코드를 몇 줄 읽다가도 흐름이 전혀 정리되지 않는다. 미적미적거리며 하루종일 코드를 몇 번 두드려 겨우 에딧텍스트 배열을 순회시켜 세팅하는 기능과, 이메일 도메인 검증 기능을 만들었다. TIL을 적기에 마땅치 않을 만큼 한 일이 없다.. 그런고로 문제풀이나 적어보자.

부족한 금액 계산하기

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개의 댓글