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