개발👩💻/알고리즘
백준 js 1978: 소수 찾기
gigibean
2021. 5. 5. 15:21
728x90
문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
예제 입력 1
4
1 3 5 7
예제 출력 1
3
풀이
소수를 찾는 방법을 알면 쉽게 풀 수 있다.
소수는 2이상의 수 중, 나누어 지는 수(약수)가 자신과 1밖에 없는 수를 말한다.
그러면 해당 수를 n라고 하고, n가 소수인지 찾기 위해 루프문 내에서 하나씩 비교해보면 된다.
그렇게 되면 O(n)이 된다.
그러나
n = a * b (a <= b)
a <= √n and b >= √n
a < √n, b < √n
=>
a * b < n
a > √n, b > √n
=>
a * b > n
a = b 이면 소수가 아니게 된다 (√n라는 수로 나누어지므로)
반대로 얘기하면 √n이하의 수로 나누어진다면 소수가 아니다.
따라서, √n까지만 검사해보면 된다.
const isPrime = (n) => {
if (n < 2) return false;
for (i = 2; i * i < n; i++) {
if (n % 1 === 0) return false;
}
return true;
}
그러나 for문에서 i < √n으로 비교하는 것은 √n가 정수가 아닐 수 있어 위험하므로
i * i < n 로 조건문을 수행한다.
전체 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require("fs"); | |
let input = (process.platform === "linux" | |
? fs.readFileSync("/dev/stdin").toString() | |
: `4 | |
1 3 5 7` | |
).split("\n"); | |
input.shift(); | |
input = input[0].split(" "); | |
const isPrime = (x) => { | |
if (x < 2) return false; | |
// 루트 x 까지만 검사 O(√x) | |
for (let i = 2; i * i <= x; i++) { | |
if (x % i == 0) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
let result = 0; | |
input.map((x) => { | |
if (isPrime(x)) { | |
result++; | |
} | |
}); | |
console.log(result); |
반응형