Kotlin/Algorithm Problems

<프로그래머스> 우박수열 정적분(Lv.2)

re트 2024. 2. 5. 10:15
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata/tree/main/%EC%9A%B0%EB%B0%95%EC%88%98%EC%97%B4%20%EC%A0%95%EC%A0%81%EB%B6%84

[프로그래머스]

https://school.programmers.co.kr/learn/courses/30/lessons/134239

제출 결과

 

월요일 아침에 손 댄 문제이지만 생각보다 쉽게 해결한 문제였다.

정말 오랜만에 정적분을 봐서 많이 당황하기는 했지만 하나하나 쪼개서 하니까 괜찮았다.(사다리꼴 넓이 공식이 생각 안 나서 매우 당황했긴 했지만...)

 

가장 먼저 우박수열이 언제 1이 되는지 계산을 했다.

이건 재귀함수를 사용해서 간단하게 구현했다.

 

그렇게 얻은 값을 가지고 한 칸 한 칸의 넓이를 먼저 구했다.

입력값으로 들어온 범위마다 구하면 시간초과가 날 것이라고 판단했기 때문이다.

 

그 다음에 주어진 범위들을 순회하면서 범위의 넓이를 answer 변수에 저장했다.

예외 처리 코드도 잘 적었다.

sliceArraysum을 써서 시간이 좀 오래 걸린 거 같긴 한데... 한 칸 넓이를 저장한 배열을 누적합 배열로 바꾼다면 좀 짧아질 거 같기도 하다.

 

해당 방법으로 작성한 코드는 다음과 같다.

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)
            }
        }
    }
}
반응형