[프로그래머스 LV1] 기사단원의 무기

Junyoung Park·2022년 11월 29일
0

코딩테스트

목록 보기
621/631
post-thumbnail

1. 문제 설명

기사단원의 무기

2. 문제 분석

  • 에라토스테네스의 체를 통해 특정 수 이하의 소수의 개수를 미리 구하자.
  • 특정 수의 약수의 개수는 즉 소인수분해를 한 뒤 각 인수에 1을 더한 값을 곱한 값
  • 주어진 조건에 따라 정답을 구한다.

3. 나의 풀이

import Foundation

func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
    let primes = eratos(number: number)
    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 num in 1...number {
        let divisorsNum = getDivisorsNum(num)
        let plused = divisorsNum > limit ? power : divisorsNum
        answer += plused
    }
    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개의 댓글