[Kotlin/프로그래머스] 코딩테스트 연습 > 연습문제 > 기사단원의 무기

👀 문제

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

👊 도전

1. 설계

  1. 문제 설명대로 구현

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import kotlin.math.roundToInt
class Solution {
fun solution(number: Int, limit: Int, power: Int): Int {
var answer: Int = 0
/**
* 1부터 num까지
* 약수 개수 > limit면 power, 아니면 약수개수를 answer에 추가
*/
(1..number).forEach { num ->
val result = calculate(num)
if (result > limit) answer += power
else answer += result
}
return answer
}

    fun calculate(num: Int): Int {
        val sqrt = Math.sqrt(num.toDouble()).roundToInt()
        val set = hashSetOf<Int>()
        (1..sqrt).forEach { i ->
            if (num % i == 0) {
                set.add(i)
                if (i != num / i) set.add(num / i)
            }

        }
        return set.size
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 제곱근을 이용하여 약수 개수를 구한다
    • 1~sqrt(n)까지 순회하며 num %i == 0인 것과, 그럴 경우 i != num / i인 것을 hashSet에 저장하여 약수를 구한다.
    • 약수 개수가 limit보다 크면 power을, 아니라면 약수 개수를 answer에 더한다.

👏 해결 완료!