치춘짱베리굿나이스
[백준] 1016 본문
제곱ㄴㄴ수
문제
어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다.
입력
첫째 줄에 두 정수 min과 max가 주어진다.
출력
첫째 줄에 min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수의 개수를 출력한다.
제한
- 1 ≤ min ≤ 1,000,000,000,000
- min ≤ max ≤ min + 1,000,000
풀이
const noSquare = () => {
let input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split(" ")
.map(Number);
const range = input[1] - input[0] + 1;
const maxSqrt = Math.floor(Math.sqrt(input[1]));
let notSquare = Array.from({ length: range }, (n) => 1);
let sum = 0;
for (let i = 2; i <= maxSqrt; i++) {
let n = i * i;
let idx = Math.ceil(input[0] / n) * n - input[0];
while (idx + input[0] <= input[1]) {
notSquare[idx] = 0;
idx += n;
}
}
for (let i = 0; i < range; i++) sum += notSquare[i];
console.log(sum);
};
noSquare();
반성회
- 범위는 무조건 100만 이하이므로 배열은 max (input[1]) 만큼이 아닌 max - min + 1 만큼으로 선언
- 제곱수는 MAX보다 작은 수만 검토하면 됨 ⇒ i는 sqrt(MAX) 보다 작거나 같아야 함
- i * i = n의 배수 중 min과 가장 가깝고 min보다 약간 큰 값 idx를 찾고, idx에 n을 곱해가면서 모든 n의 배수를 0으로 만들어 지워버린다
- 남은 1들을 더해서 개수를 센다
'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글
[백준] 1459 (0) | 2022.03.10 |
---|---|
[백준] 1308 (0) | 2022.03.10 |
[백준] 1064 (0) | 2022.03.10 |
[백준] 2583 (0) | 2022.03.10 |
[백준] 2558 (0) | 2022.03.10 |
Comments