개발👩‍💻/알고리즘

백준 js 1920: 소수 구하기

gigibean 2021. 5. 5. 17:13
728x90

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

예제 입력 1

3 16

예제 출력 1

3

5

7

11

13

풀이

에라토스테니스의 체를 이용해서 소수를 구하는 문제

2부터 n까지의 수를 배열에 넣고 루프를 돌리면서 해당 수가 소수가 아니면 지워간다.

check 배열을 통해 소수가 아닌 것은 true로 바꾸고, false로 남은 것들만 소수가 된다.

 

2부터 출발하는데, 2는 소수니까 소수 배열에 넣고, 

2의 배수는 모두 소수가 아니니까 체크한다.

 

3이되고, 3은 소수니까 소수 배열에 넣고, 

3의 배수는 모두 소수가 아니니까 체크한다.

 

4는 2의 소수로 이미 지워졌다.

 

5는 소수(false)이므로 소수 배열에 넣고,

5의 배수는 모두 소수가 아니니까 체크한다.

 

6은 이미 지워졌고

 

7은 false로 되어 있으므로 소수 배열에 넣고 

7의 배수는 모두 소수가 아니니까 체크한다.

 

...

 

이렇게 반복하다보면 소수만 남게된다.

 

// n = input[1], m = input[0]
const check = new Array(n+1).fill(false);
const prime = []
for (let i = 2; i <= n; i++) {
	if (!check[i]) {
    	prime.push(i); // check가 true로 변하지 않은 수 = 소수
        for(let j = i * 2; j <= n; j+=i) { // i씩 커지며 i의 배수를 체크
        	check[j] = true;
        }
    }
}

 

그리고 문제를 제대로 안읽어서 계속 틀렸었는데, 여기서는 Input[0]부터 input[1]까지의 수를 출력하는 것이므로,

해당하는 수만 출력해야한다.

console.log(prime.filter(x => x >= m).join("\n"));

 

전체 코드

 

반응형