득이공간

[백준 C++] 1929 소수 구하기 - 에라토스테네스의체 본문

PS/알고리즘 문제풀이

[백준 C++] 1929 소수 구하기 - 에라토스테네스의체

쟁득 2024. 2. 12. 20:21
 

1929번: 소수 구하기

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

www.acmicpc.net

#include <iostream>
using namespace std;

bool PrimeNumber[1000001];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int M, N;
	cin >> M >> N;

	for (int i = 2; i <= N; ++i)
	{
		PrimeNumber[i] = true;
	}

	for (int i = 2; i <= N; ++i)
	{
		if (!PrimeNumber[i])
		{
			continue;
		}

		for (int j = 2; i * j <= N; ++j)
		{
			PrimeNumber[i * j] = false;
		}
	}

	for (int i = M; i <= N; ++i)
	{
		if (!PrimeNumber[i])
		{
			continue;
		}

		cout << i << '\n';
	}
}

 

에라토스테네스의 체 기법으로 주어진 구간의 모든 소수를 구하는 문제입니다.

풀이 과정은 다음과 같습니다.

 

1. 구하고자 하는 소수의 범위만큼 1차원 배열 생성
2. 2부터 시작하고 현재 숫자가 지워지지 않을 때는 현재 선택된 숫자의 배수에 해당하는 수를 배열에서 끝까지 탐색하면서 지운다. - 이때 처음으로 선택된 숫자는 지우지 않는다.
3. 배열의 끝까지 2를 반복한 후 배열에서 남아 있는 구간 내의 모든 수를 출력