기본 수학 2. 2단계
2581번. 소수
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n").map((num) => Number(num));
const startNum = input[0];
const endNum = input[1];
let checkedArr = [];
// 소수 판별 실행
// 범위는 startNum ~ endNum
outer : for(let i = startNum; i <= endNum; i++){
// i가 1이면 소수가 아니므로 continue
if(i === 1){
continue;
}
// i를 2부터 i까지의 숫자로 나눠보고, 나눠지면 소수가 아니므로
// outer 반복문을 continue. 다음 숫자로 넘어감
inner : for(let j = 2; j*j <= i; j++){
if(i % j === 0){
continue outer;
}
}
// 위 조건들을 모두 통과하면 소수이므로 만들어놓은 배열에 push
checkedArr.push(i);
}
// checkedArr의 길이가 0이면 소수가 존재하지 않는 것이므로 -1 출력
if(checkedArr.length === 0){
console.log(-1);
} else {
// sum의 초기값 0, 배열의 현재 값 curr과 sum을 누적합 = 배열 원소의 합
const arrSum = checkedArr.reduce((sum, curr) => {
return sum + curr;
}, 0)
console.log(arrSum);
// Math.min() 메서드에 배열을 넣을 때는 ...(spread 연산자)를 써줘야함
console.log(Math.min(...checkedArr));
}
바로 직전 문제인 1978번 문제와 큰 차이가 없는 문제였다.
다만, 숫자가 범위로 주어졌고, 합과 최솟값을 구해야한다는 점이 달랐다.
따라서, 이전 문제처럼 filter를 사용하지는 않았고 단순 반복문으로 입력값을 넣어줬다.
반복문 앞에 생소한 outer,inner가 보이는데 이는 반복문에 label을 달아서 해당 반복문에 대하여 break나 continue를 실행하는 것이다.
이중 for문 등에서 유용하게 쓰일 수 있으니 참고하자.
이중 for문 break,continue 방법