문제
내 정답 코드
import Foundation
func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
var divisors:[Int] = []
(1...number).map {
if calDivisorCount(num: $0) > limit {
divisors.append(power)
} else {
divisors.append(calDivisorCount(num: $0))
}
}
return divisors.reduce(0, +)
}
func calDivisorCount(num: Int) -> Int {
var count = 0
for i in 1...Int(sqrt(Double(num))) {
if num % i == 0 {
if i * i == num {
count += 1
} else {
count += 2
}
}
}
return count
}
#
1. 문제 자체는 어렵지 않았지만 처음에 틀렸었다. 이유는 약수를 구하는 함수가 비효율적이라 시간초과가 된 것.
2. 약수를 효율적으로 알아내려면 약수의 특성을 이용해야 한다.
3. 첫번 째 약수를 구하고 이 약수로 나눈 값도 약수라는 점을 이용해 약수를 구하는 시간을 절반으로 줄일 수 있다.
4. 따라서 제곱근을 구해 제곱근까지만 반복문을 돌리고 같은 수의 곱이 약수인 값은 +1을 나머지는 +2를 해준다.
5. 약수의 수를 구하면 문제는 쉽게 해결할 수 있다.
배운 기술
1. sqrt()
https://developer.apple.com/documentation/accelerate/sqrt
'프로그래머스 (Swift) > lv 1' 카테고리의 다른 글
[lv1] 추억 점수 (0) | 2024.06.12 |
---|---|
[lv1] 문자열 나누기 (0) | 2024.06.02 |
[lv1] 가장 가까운 같은 글자 (0) | 2024.06.02 |
[lv1] 크기가 작은 부분 문자열 (0) | 2024.06.02 |
[lv1] 카드 뭉치 (0) | 2024.05.29 |