728x90

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

Code

최종 제출 코드

😢 원리를 이해하고 코드를 구현하는 데, 시간이 조금 걸렸다. 여러 자료도 참고했다.

😊 에라토스테네스의 체 방법으로 소수를 구하는 문제다.
소수를 구하면, 그 소수의 배수는 소수가 될 수 없다. 그래서 그 배수들을 사전에 제거하고 남은 수를 이용해 소수를 구하는 방법이다.

먼저, (1 ≤ M ≤ N ≤ 1,000,000)이므로 MAX를 선언해준다.
그리고 소수를 판단할 isPrimeArr(Array)를 N+1만큼 선언해준다(인덱스를 N까지 사용할 것이므로)
isPrimeArr는 .fill()을 이용해 모두 true값으로 세팅해줬다. 그리고 0과 1은 소수가 아니므로 false를 세팅해줬다.

for loop을 돌리면서 해당 소수의 배수는 false로 값을 바꿔준다. 그리고 조건문을 이용해 우리가 구할 숫자를 넘어가면 break;
내부 for loop에서 for조건문의 마지막을 넣지 않았는데, 그 안에 square += i를 넣어줘도 된다. 같은 의미다(배수를 계속 더해줌)

마지막에 입력 받은 구간만큼 for loop을 이용해 출력해주면 된다(isPrimeArr이 true면 소수)

아래 링크를 참고하면 이론과 함께 시각적으로 어떻게 진행되는지 볼 수 있어 좋다. 좋은 참고자료!

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소쑤)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초

ko.wikipedia.org

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Find Prime Number(에라토스테네스의 체)
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ').map(num => parseInt(num));
 
// For local test
const input = [3, 16];
const MAX = 1000000;
let M = input.shift();
let N = input.shift();
let isPrimeArr = new Array(N + 1);
let square = 0;
 
isPrimeArr.fill(true);
isPrimeArr[0] = isPrimeArr[1] = false;
 
for (let i = 2; i < N + 1; i++) {
if (isPrimeArr[i]) {
if (parseInt(Math.pow(i, 2)) > MAX) {
break;
} else {
for (square = parseInt(Math.pow(i, 2)); square < N + 1; ) {
isPrimeArr[square] = false;
square += i;
}
}
}
}
 
for (let i = M; i < N + 1; i++) {
if (isPrimeArr[i]) {
console.log(i);
}
}
728x90

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

Code

최종 제출 코드

😢 기본 '소수 찾기'문제에서 조건을 조금 추가해주면 쉽게 해결되는 문제

😊 최솟값을 구해주기 위해 Array를, 소수값의 합을 구해주기 위해 sum 변수를 추가했다.
소수를 구하는 부분은 function으로 따로 빼주었으며,
function내에서 소수를 찾으면 arr에 push함과 동시에 소수들을 sum에 누적해 줬다.
그리고 마지막에 만약 Array.length가 없다면 소수는 없는 것이므로 -1을 출력하도록 했다.

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Prime Number(Sum and Min or -1)
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
 
// For local test
const input = ['64', '65'];
const primeNumArr = [];
let primeNumSum = 0;
 
function primeNumber(n) {
if (n < 2) {
return;
}
 
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return;
}
}
primeNumArr.push(n);
primeNumSum += n;
}
 
const begin = parseInt(input.shift());
const end = parseInt(input.shift());
 
for (let i = begin; i <= end; i++) {
primeNumber(i);
}
 
if (!primeNumArr.length) {
console.log(-1);
} else {
console.log(primeNumSum);
console.log(Math.min.apply(null, primeNumArr));
}
728x90

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

Code

최종 제출 코드

😢 소수란? 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수.

😊 따로 function을 만들어서 풀었다.
0 또는 1은 소수가 아니므로 if(n < 2) 조건문을 걸어 return;했고,
2부터 자기 자신-1까지 나눠주면서 나머지가 0된다면 소수가 아니므로 return;
위의 조건에 모두 해당되지 않는다면, 해당 숫자는 소수이므로 counter++;

Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)

// Find Prime Number
 
// For submit
 
// const fs = require('fs');
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
 
// For local test
const input = ['4', '1 3 5 7'];
const T = parseInt(input.shift());
const numbers = input
.shift()
.split(' ')
.map(num => parseInt(num));
let counter = 0;
 
function primeNumber(n) {
if (n < 2) {
return;
}
 
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return;
}
}
counter++;
}
 
for (let i = 0; i < T; i++) {
primeNumber(numbers[i]);
}
 
console.log(counter);

+ Recent posts