본문 바로가기
백준 알고리즘

[JS]백준 1978번 소수찾기

by 오늘의코더 2022. 7. 12.
반응형

출처

https://www.acmicpc.net/problem/1978

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

풀이

처음에는 splice를 이용해 소수가 아닌 수를 걸러내려 하였지만 걸러내면서 index가 계속 바뀌어 실패하였다.

핵심로직

  1. 다른 분들의 정답을 참고하여 filter 메서드를 사용해서 index와 상관없이 걸러낼 수 있었다.
  2. Math.sqrt()메서드를 통해 해당수의 제곱근까지만 나누어서 소수인지 아닌지 판별 할 수 있다.

코드

첫번째 시도

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const num = Number(input[0]);
let arr = input[1].split(' ').map(Number);

for (i = 0; i < num; i++) {
    let target = arr[i];
    
    if (target === 1) {
        arr.splice(arr.indexOf(target), 1);
    }
    for (j = 2; j < target; j++) {
        if (target === 2) {
            return;
        }
        if (target % j === 0) {
            arr.splice(arr.indexOf(target), 1);
        }
    }
}
console.log(arr.length);

정답

const isPrime = (n) => {
    if (n == 1) {
      return false;
    }
    
    for (let i = 2; i <= Math.sqrt(n); i++) {
      if (n % i === 0) {
        return false;
      }
    }

    return true;
}

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const num = Number(input[0]);
let arr = input[1].split(' ').map(Number);
console.log(arr.filter((v) => isPrime(v)).length

반응형

댓글