본문 바로가기

프로그래머스 (Swift)/lv 1

[lv1] 기사단원의 무기

문제

 

내 정답 코드

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

 

sqrt | Apple Developer Documentation

Returns the square root of each element in a vector.

developer.apple.com

 

'프로그래머스 (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