Kotlin/Algorithm Problems
<프로그래머스> 우박수열 정적분(Lv.2)
re트
2024. 2. 5. 10:15
728x90
[깃허브]
[프로그래머스]
https://school.programmers.co.kr/learn/courses/30/lessons/134239
월요일 아침에 손 댄 문제이지만 생각보다 쉽게 해결한 문제였다.
정말 오랜만에 정적분을 봐서 많이 당황하기는 했지만 하나하나 쪼개서 하니까 괜찮았다.(사다리꼴 넓이 공식이 생각 안 나서 매우 당황했긴 했지만...)
가장 먼저 우박수열이 언제 1이 되는지 계산을 했다.
이건 재귀함수를 사용해서 간단하게 구현했다.
그렇게 얻은 값을 가지고 한 칸 한 칸의 넓이를 먼저 구했다.
입력값으로 들어온 범위마다 구하면 시간초과가 날 것이라고 판단했기 때문이다.
그 다음에 주어진 범위들을 순회하면서 범위의 넓이를 answer 변수에 저장했다.
예외 처리 코드도 잘 적었다.
sliceArray에 sum을 써서 시간이 좀 오래 걸린 거 같긴 한데... 한 칸 넓이를 저장한 배열을 누적합 배열로 바꾼다면 좀 짧아질 거 같기도 하다.
해당 방법으로 작성한 코드는 다음과 같다.
class Solution {
val height = arrayListOf<Int>()
fun solution(k: Int, ranges: Array<IntArray>): DoubleArray {
var answer: DoubleArray = doubleArrayOf()
val num = calHailstone(k, 0)
val areas = Array(num) { 0.0 }
for (i in 0 until num) {
areas[i] = (height[i] + height[i + 1]) / 2.0
}
ranges.forEach {
answer += when {
it[0] > num + it[1] -> {
-1.0
}
it[0] == num + it[1] -> {
0.0
}
else -> {
areas.sliceArray(it[0] until num + it[1]).sum()
}
}
}
return answer
}
private fun calHailstone(n: Int, count: Int): Int {
height.add(n)
return when {
n == 1 -> {
count
}
n % 2 == 0 -> {
calHailstone(n / 2, count + 1)
}
else -> {
calHailstone(n * 3 + 1, count + 1)
}
}
}
}
반응형