[백준] 2581. 소수 (node.js/javascript/자바스크립트/알고리즘/코딩테스트)

2021. 4. 14. 12:13Front-end/알고리즘

728x90
반응형

[백준] 1978. 소수 찾기

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 47834 18666 16210 39.444%

문제

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

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

 

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

 

출력

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

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

 

예제 입력 1

60

100

 

예제 출력 1

620

61

 

예제 입력 2

64

65

 

예제 출력 2

-1


내가 작성한 코드 (자바스크립트)

let fs = require('fs');
let input = fs.readFileSync('예제.txt').toString().split('\n');

//a이상 b이하라고 한다면
let a = Number(input[0]);
let b = Number(input[1]);
let primeNumbers = [];
let sum = 0;

for(let target = a; target <= b; target++){
    for(let p = 2; p <= target; p++){
        if(p*p > target){
            primeNumbers.push(target);
            sum += target;
            break;
        }
        if(target % p === 0){
            break;
        }
    }
}
if(primeNumbers.length === 0){
    console.log(-1);
}else{
    console.log(sum);
    console.log(primeNumbers[0]);
}

나는 a이상 b이하의 수라고 두고 문제를 풀려고 a와 b로 변수이름을 지정했다. 

a부터 b까지를 반복문을 돌며, p는 2부터 시작하고, 주어진 수가 p로 나누어 떨어진다면 소수가 아니므로 반복문을 탈출한다.

그렇게 하여 p의 제곱이 주어진 수보다 커지면 더이상 볼 것도 없이 소수이므로 primeNumbers에 주어진 수를 집어넣고 합을 누적시킨다음 반복문을 탈출한다.

 

만약 primeNumbers에 아무 원소도 없다면 (a이상 b이하의 수 중에 소수가 없는 경우) -1을 출력하고

그렇지 않다면 첫줄에 합을, 두번째 줄에 가장 작은 소수를 출력하면 된다.

728x90
반응형