728x90
반응형
[백준] 1978번 - 소수 찾기 (node.js)
문제를 풀던 중 소수찾을때 아주 좋은 공식? 방법인것 같아서 블로그에 올렸다.
링크
https://www.acmicpc.net/problem/1978
문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
예제
입력 1
4
1 3 5 7
출력 1
3
답안
const fs = require("fs");
const [cntStr, str] = fs
.readFileSync("input.txt")
.toString()
.trim()
.split(/\r?\n/);
const solution = () => {
const cnt = parseInt(cntStr);
const arr = str.split(" ").filter((d) => {
const num = parseInt(d);
if (num === 1) {
return false;
}
// 소수 찾기의 핵심
// 소수가 아닌 것을 빼버리면 남은건 소수가 된다.
// 1과 자기 자신만 자신을 나눈 나머지가 0이 되어야하는데
// 그 외의것에서 0이 나오면 그것은 소수가 아니다!
for (let i = 2; i <= Math.sqrt(num); i++) {
if (d % i === 0) {
return false;
}
}
return true;
});
console.log(arr.length);
};
solution();
Math.sqrt()의 사용 이유
solution함수 내에서 Math.sqrt(d)을 사용하는 이유는 소수 판별 시간을 줄이기 위함입니다.
숫자 n이 소수인지 판별하기 위해서는 n을 1과 n 자신을 제외한 다른 숫자들로 나누어보며 나머지가 0인지 확인해야 합니다.
그러나 모든 숫자를 확인할 필요는 없으며, n의 제곱근까지만 확인해도 충분합니다.
왜 제곱근까지만 확인하면 될까?
- 만약 n이 어떤 수의 제곱이 아니라면, n을 나눌 수 있는 가장 큰 수는 n의 제곱근보다 작습니다.
- 예를 들어, n이 100이라면 100의 제곱근은 10입니다. 100을 나눌 수 있는 수는 1, 2, 4, 5, 10, 20, 25, 50, 100이지만, 이 중 10 이상의 수는 100을 나누는 쌍의 작은 수와 대응됩니다(예: 50은 2와 대응).
- 따라서 n의 제곱근을 초과하는 수로 n을 나눌 필요가 없습니다.
- 제곱근 이하의 수로 나누어 떨어지지 않는다면, 그 이상의 수로도 나누어 떨어지지 않기 때문입니다.
이 방법을 사용함으로써 소수 판별 함수의 실행 시간을 상당히 단축시킬 수 있습니다. 이는 특히 n이 매우 큰 수일 때 효과적입니다.
728x90
반응형
'코딩 테스트' 카테고리의 다른 글
[백준] 3009번 - 네 번째 점 (node.js) (0) | 2024.04.30 |
---|---|
[백준] 2581번 - 소수 (node.js) (0) | 2024.04.29 |
[백준] 2869번 - 달팽이는 올라가고 싶다 (node.js) (0) | 2024.04.26 |
[백준] 1193번 - 분수찾기 (node.js) (1) | 2024.04.25 |
[백준] 2292번 - 벌집 (node.js) (1) | 2024.04.25 |
댓글