내가 제출한 코드 :
function solution(left, right)
{
let sum = 0;
for(let i = left; i <= right; i++)
{
let count = 0;
for(let j = 1; j <= parseInt(Math.sqrt(i));j++)
{
i % j == 0 ? i / j != j ? count += 2 : count += 1 : count += 0;
}
count % 2 == 0 ? sum += i : sum -= i
}
return sum;
}
위의 코드로 Math.sqrt()로 제곱근을 구해 반복문의 수행시간을 줄이고, 약수의 개수를 구한 후,
약수의 개수에 따라 더할건지, 뺄건지 결정을 했다.
그런데!! 다른 사람의 코드를 보고
let count = 0;
for(let j = 1; j <= parseInt(Math.sqrt(i));j++)
{
i % j == 0 ? i / j != j ? count += 2 : count += 1 : count += 0;
}
count % 2 == 0 ? sum += i : sum -= i
부분을 획기적으로 줄일 수 있다는 사실을 알게 됐다.
그 방법에는 Number.isInteger()함수를 사용해야 하는데
isInteger(n)에서 n이 정수이면 true, 아니면 false를 반환한다.
이를 바탕으로,
function solution(left, right) {
let result = 0;
for (let i = left; i <= right; i++) {
if (Number.isInteger(Math.sqrt(i))) result -= i;
else result += i;
}
return result;
}
위와 같이 표현할 수 있었다.
Number.isInteger( Math.sqrt() )에 가 true 될 수 있는 수는
4(1, 2, 4), 9(1, 3, 9), 16(1, 2, 4, 8 16) 같이 약수가 홀수인
수 밖에 없다.
Number.isInteger( Math.sqrt() )에 가 false인 수는
6(1, 2, 3, 6), 8(1, 2, 4, 8), 10(1, 2, 5, 10)같이 약수가 짝수인
수 밖에 없다.
제곱근을 이용하면 좋다는 생각은 해봤지만 이런 식으로 약수의 개수가 홀수인지, 짝수인지
구별할 수 있다는 사실은 몰랐었다.
내가 짠 코드 수행 시간 :
남이 짠 코드 수행 시간 :
수행시간 측면에서 엄청난 차이가 있다는 걸 확인할 수 있다.
'문제 풀기 > JavaScripts' 카테고리의 다른 글
문제 35. 부족한 금액 계산하기(난이도 5)(가우스 공식) (0) | 2024.07.23 |
---|---|
문제 34. (중요)문자열 내림차순으로 배치하기(난이도 7)(문자열 sort, join) (0) | 2024.07.23 |
문제 32. 내적(난이도 1) (0) | 2024.07.18 |
문제 31. 수박수박수박수박수박수?(난이도 7)(repeat, slice) (0) | 2024.07.18 |
문제 30. 가운데 글자 가져오기(난이도 2)(문자열[]->문자) (0) | 2024.07.18 |