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

[JS]백준 2581번 소수

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

출처

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

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

풀이

이 문제는 주어진 두 수 안에 있는 소수의 합과 최솟값을 구하는 문제인데, 저번에 소수 판별 알고리즘을 배워서 쉽게 접근할 수 있었다.

https://todayscoder.tistory.com/entry/JS%EB%B0%B1%EC%A4%80-1978%EB%B2%88-%EC%86%8C%EC%88%98%EC%B0%BE%EA%B8%B0

[JS]백준 1978번 소수찾기

출처 https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 문제 주어진..

todayscoder.tistory.com




접근

  1. 소수를 담을 배열을 만든다.
  2. for문으로 숫자를 돌면서 소수 판별 함수에 넣는다. 만약 소수이면 배열에 추가한다.
  3. 최솟값은 배열의 첫번째이고, 합은 역시 for문으로 구해준다. 소수배열이 없다면 -1을 출력한다.

코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
const [min, max] = input.map(Number);
let primeArr = [];

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;
}

for (i = min; i <= max; i++) {
    if (isPrime(i)) {
        primeArr.push(i);
    }
}

let sum = 0;

for (i = 0; i < primeArr.length; i++) {
    sum += primeArr[i];
}

console.log(primeArr.length === 0 ? -1 : `${sum}\n${primeArr[0]}`);

반응형

댓글