승코딩당당당

[C++] 백준 1929: 소수 구하기 본문

PS/BOJ

[C++] 백준 1929: 소수 구하기

승코딩당당당 2026. 2. 3. 15:41

문제

[C++] 백준 1929: 소수 구하기 SILVER 3
https://www.acmicpc.net/problem/1929

 


 

접근 방법

이 문제는 주어진 구간 [M, N] 안에 있는 모든 소수를 출력하는 문제다.
가장 전형적으로 떠올릴 수 있는 방법은 에라토스테네스의 체를 사용하는 것이다.

https://xeungcoding.tistory.com/58

 

소수(prime number) 구하기 - 에라토스테네스의 체

그래프나 탐색 알고리즘뿐만 아니라, 코딩 테스트에서는 수학적 개념을 코드로 구현하는 문제도 자주 출제된다.그중 대표적인 주제가 바로 소수 구하기이다.소수는 정의 자체는 단순하지만, 입

xeungcoding.tistory.com

 

아이디어는 다음과 같다:

1) 먼저 0 ~ N까지 담을 수 있는 배열을 만든다.이렇게 하면 vect[i] == i 인 상태에서 시작한다.

  • 이렇게 하면 vect[i] == i 인 상태에서 시작한다.
vector<int> vect(n + 1, 0);
for (int i = 0; i <= n; i++)
	vect[i] = i;

 

2) 2부터 N까지 순회하면서, 현재 수 i가 아직 지워지지 않았다면(vect[i] != 1) i의 배수들을 전부 지워주면 된다.

 

  • vect[j] = 1로 만들어서 “이 인덱스는 소수가 아님”을 표시했다.
  • 결국 마지막까지 1로 바뀌지 않은 수들만 소수로 남는다.

 

for (int i = 2; i <= n; i++)
{
	if (vect[i] != 1)
	{
		for (int j = i * 2; j <= n; j += i)
		{
			if (vect[j] != 1)
				vect[j] = 1;
		}
	}
}

 

3) 마지막으로, 구간 [M, N]을 순회하면서 vect[i] != 1 인 값들만 출력하면 된다.

for (int i = m; i <= n; i++)
{
    if (vect[i] != 1)
        cout << vect[i] << '\n';
}

 

이렇게 하면 소수를 매번 나눠보는 방식이 아니라,
한 번의 체 작업으로 전체 범위에 대한 소수 정보를 만들어두고 빠르게 출력할 수 있다.

 

구현 시 주의할 점

  • 0과 1은 소수가 아니지만, 코드에서는
    • 0은 사용하지 않고
    • 1은 vect[1] = 1로 초기화되어 자동으로 “소수 아님” 상태라 추가 처리가 필요 없다.
  • 배수를 지울 때 j = i * 2부터 시작해 j += i로 진행하면서
    vect[j] = 1로만 바꾸고, 이미 1인 경우는 다시 바꿀 필요가 없다.
  • 이 코드는 i를 2부터 N까지 모두 돌고 있지만, 이론적으로는 sqrt(N)까지만 돌고 그 이후는 생략해도 된다.
    그래도 제한 내에서는 현재 구현으로도 충분히 통과한다.

 

 


 

코드

#include <iostream>
#include <vector>
using namespace std;

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

	int m = 0, n = 0;
	cin >> m >> n;

	vector<int> vect(n + 1, 0);
	for (int i = 0; i <= n; i++)
		vect[i] = i;

	for (int i = 2; i <= n; i++)
	{
		if (vect[i] != 1)
		{
			for (int j = i * 2; j <= n; j += i)
			{
				if (vect[j] != 1)
					vect[j] = 1;
			}
		}
	}
	for (int i = m; i <= n; i++)
	{
		if (vect[i] != 1)
			cout << vect[i] << '\n';
	}

	return 0;
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 17219: 비밀번호 찾기  (0) 2026.02.10
[C++] 백준 1456: 거의 소수  (0) 2026.02.10
[C++] 백준 13022: 늑대와 올바른 단어  (0) 2026.02.03
[C++] 백준 1946: 신입 사원  (2) 2026.02.01
[C++] 백준 5585: 거스름돈  (0) 2026.02.01