백준
[실버] 소수 찾기 (1978번)
chsua
2022. 11. 25. 10:31
문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
내 답안:
const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\\n");
arr = input[1].split(" ").map(Number) ;
let prime = [] ;
let count = 0 ;
arr.forEach(function(x){
for (let i = 2 ; i <= x ; i++ ){
if (x%i == 0 ) prime.push(i)
}
if (prime.length == 1 ) count++
prime = [] ;
}) ;
console.log(count);
>> forEach안에서 소수를 찾는 for반복문을 작동하고, 소수이면 count++ 처리
>> 각 요소가 소수인지 다 나누어서 확인해보고 count처리하기 때문에 오래걸림
내 답안:
const fs = require('fs');
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\\n");
let prime = {} ;
for (let i = 2 ; i <= 1000 ; i++) prime[i] = 1 ;
for (let i = 2 ; i <= 1000 ; i++){
if ( prime[i] === 1 ){
for (let j = i*i ; j <= 1000 ; j += i){
prime[j] = 0 ;
}
}
}
let arr = input[1].split(" ").map(Number) ;
let count = 0 ;
arr.forEach(function(x){
if (prime[x] == 1 ) count++
})
console.log(count) ;
>>다른 사람 답안 참고하여 만들어본 식.. 위에보다 속도 2/3으로 줄음!
>> prime 객체를 만들어서 소수를 찾을 수 있게 만들어버림
>> 일일이 소수인지 나누어서 확인하지 않아도 됨
>> " for (let j = i*i ; j <= 1000 ; j += i) " 를 통해 i의 배수를 0처리