JS/알고리즘
JS, 약수구하기
Hyeon_E
2023. 11. 23. 23:07
기존의 반복문으로 주어진 수의 절반을 대상으로 확인하기를 하니 코테 문제 시간초과가 뜸
더 효율적인 방법이 필요하여 방법을 찾아보고 정리
[ 제곱근 사용하기 ]
약수를 구하고자 하는 수를 n이라고 하면 1 ~ √n 범위로 n의 약수를 구함
n의 약수를 나누었을 때 값 또한 n의 약수
√n의 값이 정수로 떨어질 경우 약수와 나누었을때의 값으로 넣은 약수가 중복되므로 중복제거를 해야함
▶ 약수 구하는 코드
조건문 사용
const getDivisors = (num) => {
let result = [];
for(let i = 1 ; i <= Math.sqrt(num) ; i++){
if(num % i === 0) {
result.push(i);
if(num / i != i) result.push(num / i); //중복 제거
}
}
result.sort((a, b) => a - b); //오름차순 정리
return result;
}
Set 사용
const getDivisors = (num) => {
let result = [];
for(let i = 1 ; i <= Math.sqrt(num) ; i++){
if(num % i === 0) result.push(i, num/i);
}
result.sort((a, b) => a - b); //오름차순 정리
return Array.from(new Set(result)); //중복제거
}
▶ 약수 개수 구하는 코드
위의 코드의 배열의 length, set한 상태로 size를 구하거나 혹은
const getDivisors = (num) => {
let result = 0, n = Math.sqrt(number);
for(let i = 1 ; i < n ; i++){
if(num % i === 0) result++;
}
return n === Math.floor(n) ? result * 2 + 1 : result * 2 //제곱근의 정수로 떨어질 경우 +1, Ex)100->10
}