프로그래머스 – L1 기사단원의



설계

약수의 수를 찾을 수 있으면 원활하게 해결되는 것 같습니다.

소수 자릿수를 결정하는 방법을 고려할 때 숫자의 제곱근을 확인하는 메모리를 사용합니다.

힘내: 기사단 무기

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/136798


문제를 해결하다

숫자를 반복하고 인덱스의 제수 + 1을 설정합니다.

제수의 수를 반환하는 알고리즘은 항상 수의 제곱근으로 나누고 나머지가 없으면 계산하므로 나눗셈과 몫을 꼭 확인하세요!

제수로 채워진 숫자를 제한 이하로 필터링한 후, 제한을 초과한 기사의 합과 숫자 * 제공된 무기의 공격력으로 원하는 값을 반환할 수 있습니다.

import Foundation
// 약수의 수가 공격력
// limit 제한
// power : 초과한 기사들의 무기 공격력
func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
    var numbers = Array.init(repeating: 0, count: number)
    
    numbers.indices.forEach{ index in
        numbers(index) = getCountOfDivisor(index + 1)
    }
    
    //print(numbers)
    
    let numbersCount = numbers.count
    let filteredNumbers = numbers.filter { item in
        return item <= limit
    }
    
    let sum = filteredNumbers.reduce(0, +) + (( numbersCount - filteredNumbers.count ) * power )
    
    return sum
    
}

func getCountOfDivisor(_ number: Int) -> Int {
    var count = 0
    
    let range = 1...Int(sqrt(Double(number)))
    
    for index in range {
        if(number % index == 0) {
            if(index == number / index) {
                count += 1
            }
            else {
                count += 2
            }
        }
    }
    return count
}

다른 사람의 솔루션 분석

프로그래머 – 이학진-VV


import Foundation

func solution(_ number:Int, _ limit:Int, _ power:Int) -> Int {
    var steelCount: Int = 0

    (1...number).map{ knight in
        let count = divisorCount(knight)
        steelCount += (count > limit) ? power : count
    }
    return steelCount
}

func divisorCount(_ num: Int) -> Int {
    var count: Int = 0

    for n in 1...Int(sqrt(Double(num))) {
        if num % n == 0 {
            count += 2
            if n * n == num {
                count -= 1
            }
        }
    }
    return count
}

해결 메커니즘은 동일하지만 배열을 만들지 않고 Range와 Map을 사용합니다.

정리하다

약수의 수를 찾는 방법! 몫과 나눗셈이 같을 때 계산할 때 조심하세요!