에라토스테네스의 체를 통해 특정 범위 내 소수를 특정한 뒤, 특정 수를 해당 소수를 사용해 소인수분해했다. 해당 약수의 개수는 소인수분해된 각 지수에 1씩 더한 값을 곱한 값이다.
import Foundation
func solution(_ left:Int, _ right:Int) -> Int {
let primes = eratos(right)
var answer = 0
func getDivisorsNum(_ number: Int) -> Int {
var result = 1
var number = number
for prime in primes {
if number < prime {
break
}
var count = 0
while number % prime == 0 {
number /= prime
count += 1
}
if count > 0 {
result *= (count + 1)
}
}
return result
}
for number in left...right {
let divisorsNum = getDivisorsNum(number)
if divisorsNum % 2 == 0 {
answer += number
} else {
answer -= number
}
}
return answer
}
func eratos(_ number: Int) -> [Int] {
var numbers = Array(repeating: true, count: number + 1)
numbers[0] = false
numbers[1] = false
for idx in 2..<numbers.count {
if numbers[idx] {
if idx * 2 < numbers.count {
for idx2 in stride(from: idx * 2, to: numbers.count, by: idx) {
numbers[idx2] = false
}
}
}
}
let primes = numbers.enumerated().filter{$0.element}.map{$0.offset}
return primes
}