본문 바로가기

코테/프로그래머스

[프로그래머스 Lv.1] 기사단원의 무기 (kotlin ver.)

import kotlin.math.sqrt

class Solution(){
    fun solution(number: Int, limit: Int, power: Int): Int {
        var answer: Int = 0
        var overpower = mutableListOf<Int>()

        var countList = (1..number).map {
            countDivider(it)
        }.toList()

        countList.forEach { count ->
            if (count > limit) {
                overpower.add(power)
            } else {
                overpower.add(count)
            }
        }

        for (i in overpower) {
            answer += i
        }

        return answer
    }

    private fun countDivider(number: Int): Int {
        var count = 0
        val temp = sqrt(number.toDouble()).toInt() // sqrt(k)는, f(x) = x^2 - k = 0의 근

        for (l in 1..temp) {
            if (number % l == 0) {
                if (l * l == number) {
                    count++
                } else {
                    count += 2
                }
            }
        }

        return count
    }
}

이 문제는 일반적인 약수를 구하는 방법인 나머지 연산을 통해 구하면 time over 된다.

제곱근 함수를 이용하면 보다 빠르게 계산이 가능하여 pass 할 수 있다!