기사 번호지정 1부터 number까지, 무기점에서 무기를 구매할 때 자신의 기사 번호의 약수 개수에 해당하는 공격력 가진 무기를 구매할 수 있다. 제한수치보다 큰 공격력을 가진 무기라면 정해지는 공격력을 가진 무기를 구매해야 함.
공격력 1당 1kg의 철이 필요하다면 무기점에서 모든 무기를 만들기 위해 필요한 철의 무게는?
풀이
function solution(number, limit, power) {
var result = [];
var aa = 0;
for (var i = 1; i <= number; i++) {
result.push(i);
var currentNumber = result[i - 1];
var count = 0;
for (var j = 1; j <= currentNumber; j++) {
if (currentNumber % j === 0) {
count++;
}
}
aa += (count <= limit) ? count : power;
}
return aa;
}
첫 코드.. 풀리긴 했지만 시간 초과로 실패
function solution(number, limit, power) {
let answer = 0;
for (let i = 1; i <= number; i++) {
let aa = 0;
const sq = Math.sqrt(i);
for (let j = 1; j <= sq; j++) {
if (i % j === 0) {
aa += (j === sq) ? 1 : 2;
}
}
if (aa <= limit) {
answer += aa;
} else {
answer += power;
}
}
return answer;
}
for
1부터 number까지 반복하고 각 숫자에 대한 약수를 찾는 중첩 루프 사용
sq를 사용해 불필요한 계산 줄임
if(i % j ===0) : 약수 찾기
sq ? 1: 2 제곱근이 정수일 때와 아닐때 약수 중복 여부 처리
limit과 비교해서 결과값 반환
다른 풀이
function solution(number, limit, power) {
var answer = 0;
for (let n = 1; n <= number; n++)
{
let count = 0;
for (let j = 1; j * j <= n; j++)
{
if (j * j == n) count++;
else if (n % j == 0) count += 2;
}
if (count > limit) count = power;
answer += count;
}
return answer;
}
function solution(number, limit, power) {
var answer = 0;
for (let n = 1; n <= number; n++) {
for (let j = 1; j * j <= n; j++) {
let count = (j * j === n) ? 1 : (n % j === 0) ? 2 : 0;
answer += count;
}
if (answer > limit) answer = power;
}
return answer;
}
function solution(number, limit, power) {
const sum = (num) => {
let res = 0;
for (let i = 1; i * i <= num; i++) {
if (i * i === num) res++;
else if (num % i === 0) res += 2;
}
return res;
};
return Array.from({ length: number }, (el, i) => i + 1)
.map((el) => (sum(el) > limit ? power : sum(el)))
.reduce((acc, cur) => acc + cur, 0);
}