일단 문제 자체가 이해하는데 시간이 오래 걸렸다...ㅎ
공책 펴두고 적어가면서 정리했는데,
1 for문 사용하여 기사들 수 반복
2 각 기사의 약수의 개수(즉 각 공격력)을 담은 배열 초기값 설정 (arr = [];)
3 약수의 개수를 찾는 반복문, 개수를 (2번)배열에 push 해주기
4 (2번의)약수의 개수 담은 배열에 .map 사용하여 초과값 power로 변경
5 .reduce 사용하여 모든 값 더해주기
이렇게 정리했고, 순서대로 코드를 짜봤다.
function solution(number, limit, power) {
let factor = [];
for (let i=1; i<=number; i++) {
let count = 0;
for (let j=1; j<=i; j++) {
if (i % j === 0) {
count++;
}
}
factor.push(count);
}
let limitP = (p) => {
if (p > limit) {
return power;
} return p;
};
let reduce = (cur, add) => {
return cur + add;
}
return factor.map(limitP).reduce(reduce);
}
** 일단 틀린 건 아닌 거 같은데, 시간초과로 실패했다.
어떤 걸 의미없이 반복하면서 시간을 잡아먹는 건지 알아봐야겠음
뭔가 약수를 구하는 반복문이 비효율적일 것 같다. 그 외에는 다 줄일 수 없는 것임(아마)
1. 제곱근만큼만 반복문 진행 (count + 2)
> 약수는 항상 짝이 있기 때문 (8의 경우 {1,8}, {2,4})
2. 제곱근이 같은 경우 빼주기 (count -1)
> 25의 경우 {5,5}가 중복됨
위 조건을 추가해서 계산을 줄여봐야겠다
function solution(number, limit, power) {
let factor = [];
for (let i=1; i<=number; i++) {
let count = 0;
let sqrt = Math.sqrt(i);
for (let j=1; j<=sqrt; j++) {
if (i % j === 0) {
count+=2;
}
if (j === i/j) {
count --;
}
}
factor.push(count);
}
let limitP = (p) => {
if (p > limit) {
return power;
} return p;
};
let reduce = (cur, add) => {
return cur + add;
}
return factor.map(limitP).reduce(reduce);
}
통과 -!
'코딩 테스트 > test_javaScript' 카테고리의 다른 글
[코딩테스트/javaScript] 옹알이 (2) (1) | 2025.01.20 |
---|---|
[코딩테스트/javaScript] 로또의 최고 순위와 최저 순위 (1) | 2025.01.19 |
[코딩테스트/javaScript] 덧칠하기 (1) | 2025.01.17 |
[코딩테스트/javaScript] 모의고사 (1) | 2025.01.16 |
[코딩테스트/javaScript] 과일 장수 (1) | 2025.01.15 |