해당 수의 약수인지 아닌지 1부터 그 수까지 반복문을 돌려서 구할 수도 있지만, 효율성이 많이 떨어진다.
코테에서는 시간 초과가 될 가능성도 크다.
특히 특정 범위의 모든 수의 약수를 각각 구해야 하는 경우는 매우 비효율적이다.
소수를 효율적으로 구할 때 에라토스테네스의 체라는 알고리즘을 사용하는데, 역시나 같은 알고리즘을 사용할 수 있다.
에라토스테네스의 체는, 1부터 n까지의 수들의 배수를 차례대로 채워나가면서 효율적으로 약수의 개수를 구할 수 있는 알고리즘이다.
만약 1부터 n까지의 범위에 있는 모든 수의 약수의 개수를 각각 구하려면,
- 크기가 n+1인 배열 생성
- index 와 수를 일치시키기 위해 n+1 크기로 배열을 생성한다.
- 생성한 배열의 기본값을 모두 0으로 채운다.
const numbers = new Array(num+1).fill(0);
- 특정 수의 배수 추가
- 특정 수(index)의 배수를 모두 +1한다.
- 약수는 숫자의 전 범위에 걸쳐 나타날 수 있기 때문에, 소수와 다르게 전체 범위로 반복문을 돌린다.
for (let i = 1; i <= num; i++) { for (let j = i; j <= num; j += i) { numbers[j]++; } }
- 약수의 개수 찾기
- 해당 index의 요소값 찾으면 된다. (배열 자체가 약수의 개수를 담고 있다!)
'클라이언트 > JavaScript' 카테고리의 다른 글
[자바스크립트(JavaScript)] 리덕스(Redux) (1) | 2024.02.13 |
---|---|
[자바스크립트(JavaScript)] Million.js (0) | 2024.02.06 |
[자바스크립트(JavaScript)] 특정 범위에서 소수 구하기(에라토스테네스의 체) (0) | 2024.01.10 |
[자바스크립트(JavaScript)] Builder 패턴 (0) | 2023.12.18 |
[자바스크립트(JavaScript)] Audio (0) | 2023.12.16 |