말랑말랑한 개발자 이야기

[백준 1929번] 소수 구하기 본문

알고리즘/백준

[백준 1929번] 소수 구하기

말랑너구리 2021. 1. 8. 23:59

[백준 1929번] 소수 구하기

www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

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

www.acmicpc.net

 

 

 문제

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

 

 

 입력

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

 

 

 출력

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

 

 

 풀이

#include <iostream>
using namespace std;

int main() {
	int M,N;
	cin >> M >> N;
	
	bool arr[1000001] = {false,};
	arr[1] = true;
	
	for(int i=2;i<=1000;i++){
		int k=2;
		if(arr[i]==true) continue;
		while(i*k <= 1000000){
			arr[i*k] = true;
			k++;
		}
	}
	
	for(int i=M;i<=N;i++){
		if(arr[i]==false) cout << i << '\n'; 
	}
	return 0;
}

 심심풀이땅콩으로 풀어본 문제이다. 에라토스테네스의 체라는 방식을 사용하여 소수를 구한다. 이 방법은 소수임을 판단하는 데 있어 숫자 하나마다 판별하는게 아니라 어떤 범위내에서 2의 배수를 제외시키고, 3의 배수를 제외시키고... 하는 방식으로 소수가 아닌 숫자들을 제외시키고 남은 숫자들을 소수로 판단하는 방법이다. 소수를 판단할 때에 특성상 제곱근까지만 확인하면 되기때문에 시간을 줄일 수 있다.

 1이 소수가 아님을 간과하고 문제를 푼 것 빼고는 문제되는 부분이 없었다.

 

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1339번] 단어 수학  (0) 2021.01.09
[백준 11659번] 구간 합 구하기 4  (0) 2021.01.09
[백준 11000번] 강의실 배정  (0) 2021.01.06
[백준 1655번] 가운데를 말해요  (0) 2021.01.06
[백준 1107번] 리모컨  (0) 2021.01.06