function getDivisor(number){
const divisor = [];
for(let i = 1; i <= number; i++){
if(number % i === 0){
divisor.push(i);
}
}
return divisor.length;
}
function purchaseWeapon(states, limit, power){
let steel = 0;
states.forEach((state) => {
if(state > limit){
steel += power;
}
if(state <= limit){
steel += state;
}
})
return steel;
}
function solution(number, limit, power) {
const knights = new Array(number).fill(0);
const attackStates = knights.map((_, index) => {
const state = getDivisor(index + 1);
return state;
});
const totalSteel = purchaseWeapon(attackStates, limit, power);
return totalSteel;
}
시간 초과로 인해 오답 처리되었다.
map
내부에서 for
가 동작하기 때문에 시간 소모가 크다.getDivisor
에서 number
까지 전부 연산을 하기 때문에 시간 소모가 크다.기능을 쪼개는 것에 집중한 나머지
함수 하나하나에서 시간 소모가 심한 반복문이 작성된 것도 한몫하는 것 같다.
function getDivisor(number){
const divisor = [];
for(let i = 1; i <= (number / 2); i++){
if(number % i === 0){
divisor.push(i);
}
}
return divisor.length + 1;
}
function purchaseWeapon(states, limit, power){
let steel = 0;
states.forEach((state) => {
if(state > limit){
steel += power;
}
if(state <= limit){
steel += state;
}
})
return steel;
}
function solution(number, limit, power) {
const knights = new Array(number).fill(0);
const attackStates = knights.map((_, index) => {
const state = getDivisor(index + 1);
return state;
});
const totalSteel = purchaseWeapon(attackStates, limit, power);
return totalSteel;
}
우선 약수를 구하는 부분을 개선해보았다.
주어진 숫자의 절반까지만 구한 뒤에 +1
을 하면 약수의 개수를 얻을 수 있다는 점을 활용했다.