[프로그래머스 LV1] 약수의 개수와 덧셈

Junyoung Park·2022년 8월 29일
0

코딩테스트

목록 보기
593/631
post-thumbnail

1. 문제 설명

약수의 개수와 덧셈

2. 문제 분석

에라토스테네스의 체를 통해 특정 범위 내 소수를 특정한 뒤, 특정 수를 해당 소수를 사용해 소인수분해했다. 해당 약수의 개수는 소인수분해된 각 지수에 1씩 더한 값을 곱한 값이다.

3. 나의 풀이

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
}
profile
JUST DO IT

0개의 댓글