오늘은 각 기사의 번호에 대한 약수 개수를 구하고, 그 개수가 정해진 제한 수치를 넘으면 특정 공격력을 적용하여 필요한 철의 총 무게를 계산하는 문제를 풀었다. 효율적으로 약수의 개수를 구하고 제한 조건에 따라 철의 무게를 최적화하는 방법을 학습했다.
약수 개수 계산: 각 기사의 번호에 대한 약수 개수를 구하기 위해 countDivisors라는 함수를 만들었다. 약수는 n의 제곱근까지만 검사하여 효율적으로 구할 수 있다. 이를 통해 각 기사의 공격력을 계산할 수 있다.
제한 수치 적용: 각 기사의 약수 개수를 구한 후, 만약 이 수치가 limit을 넘으면 협약기관에서 지정한 power를 공격력으로 사용하고, 넘지 않으면 원래 약수 개수를 그대로 공격력으로 사용한다.
철의 총 무게 계산: 각 기사의 공격력을 모두 합산하여 철의 총 무게를 계산한다.
import Foundation
func solution(_ number: Int, _ limit: Int, _ power: Int) -> Int {
// 약수 개수를 계산하는 함수
func countDivisors(_ n: Int) -> Int {
var count = 0
for i in 1...Int(Double(n).squareRoot()) {
if n % i == 0 {
count += 1
if i != n / i {
count += 1
}
}
}
return count
}
var totalIron = 0 // 필요한 철의 총 무게
// 각 기사의 약수 개수를 기반으로 철의 무게 계산
for i in 1...number {
let divisorsCount = countDivisors(i)
if divisorsCount > limit {
totalIron += power
} else {
totalIron += divisorsCount
}
}
return totalIron
}
약수 개수 계산 함수 countDivisors:
n의 제곱근까지만 순회하여 약수를 구하는 함수다. i가 n의 약수라면 i와 n / i 모두 n의 약수이므로 둘을 더해 약수 개수를 계산한다.
이렇게 하면 약수 개수를 빠르게 구할 수 있어 시간 복잡도를 줄일 수 있다.
철의 무게 계산:
각 기사 번호 i에 대해 countDivisors(i)를 호출하여 약수 개수를 구하고, 그 값이 limit보다 크면 power를 철 무게로 사용하고, 그렇지 않으면 약수 개수만큼의 무게를 사용한다.
이렇게 계산된 각 기사의 철 무게를 totalIron에 합산하여 모든 기사의 총 무게를 계산한다.
결과 반환:
모든 기사의 철 무게를 합산한 결과 totalIron을 반환하여 필요한 철의 총 무게를 반환한다.
예제 1: number = 5, limit = 3, power = 2
각 기사의 약수 개수: [1, 2, 2, 3, 2]
약수 개수가 제한을 넘지 않으므로 모든 값을 그대로 합산: 1 + 2 + 2 + 3 + 2 = 10
결과: 10
예제 2: number = 10, limit = 3, power = 2
각 기사의 약수 개수: [1, 2, 2, 3, 2, 4, 2, 4, 3, 4]
약수 개수가 4인 경우 제한 수치를 초과하므로 power인 2를 사용: 1 + 2 + 2 + 3 + 2 + 2 + 2 + 2 + 3 + 2 = 21
결과: 21
효율적인 약수 계산 방법: 모든 숫자를 나누어 확인하기보다 제곱근까지만 순회하여 약수를 구하는 방식이 매우 효율적이라는 것을 다시 확인했다. 큰 수일수록 시간 복잡도를 줄이는 데 큰 도움이 된다.
조건 적용 로직의 중요성: 약수 개수를 구하고 조건에 따라 철 무게를 다르게 적용하는 로직을 설계하는 데 있어서, 제한 수치를 초과하는 경우와 그렇지 않은 경우를 명확히 구분하여 조건문을 작성하는 것이 중요했다.
제곱근 활용 약수 계산의 이해: 제곱근을 활용해 약수 짝을 찾는 방식은 처음에는 익숙하지 않았지만, 반복문이 줄어들어 성능이 크게 향상된다는 것을 배웠다.
조건 적용에서의 헷갈림: limit을 넘는 경우와 넘지 않는 경우 각각에 대해 다른 공격력을 적용해야 해서 조건문을 정확하게 작성하는 데 주의를 기울였다.
이번 문제를 통해 효율적인 약수 계산 방식과 조건에 따른 값 적용 방식을 배웠다. 특히, 특정 범위 내에서 효율적인 계산이 필요한 경우 제곱근을 활용하는 방법이 매우 유용하다는 점을 깨달았다. 앞으로 다양한 문제에서 약수 개수를 다룰 때 이번 방식을 응용할 수 있을 것 같다.