약수의 수를 찾을 수 있으면 원활하게 해결되는 것 같습니다. 소수 자릿수를 결정하는 방법을 고려할 때 숫자의 제곱근을 확인하는 메모리를 사용합니다.
힘내: 기사단 무기 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/136798 숫자를 반복하고 인덱스의 제수 + 1을 설정합니다. 제수의 수를 반환하는 알고리즘은 항상 수의 제곱근으로 나누고 나머지가 없으면 계산하므로 나눗셈과 몫을 꼭 확인하세요! 제수로 채워진 숫자를 제한 이하로 필터링한 후, 제한을 초과한 기사의 합과 숫자 * 제공된 무기의 공격력으로 원하는 값을 반환할 수 있습니다.
해결 메커니즘은 동일하지만 배열을 만들지 않고 Range와 Map을 사용합니다.
약수의 수를 찾는 방법! 몫과 나눗셈이 같을 때 계산할 때 조심하세요!
설계
문제를 해결하다
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
}정리하다