💻코딩테스트/백준
[백준/C++] 1929번 : 소수 구하기 (sqrt, 에라토스테네스의 채 비교)
공대 컴린이
2023. 7. 17. 17:51
728x90
소수 구하기
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
예제 입력 1
3 16
예제 출력 1
3
5
7
11
13
특정 범위 안에 소수를 구하는 문제로, sqrt를 이용해 문제를 해결하는 방법과 에라토스테네스의 채를 이용해 해결하는 두 가지 방법으로 풀이해보았다.
✔️ sqrt 이용
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
bool IsPrime(int n)
{
if (n <= 1) return false;
for(int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int M, N;
cin >> M >> N;
for(int i = M; i <= N; i++)
{
if (IsPrime(i))
cout << i << '\n';
}
return 0;
}
✔️ 에라토스테네스의 채 이용
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int M, N;
cin >> M >> N;
vector<bool> check(N+1);
check[0] = check[1] = true;
for(int i = 2; i <= sqrt(N); i++)
{
if(!check[i])
{
for (int j = i + i; j <= N; j += i)
check[j] = true;
}
}
for(int i = M; i <= N; i++)
{
if (!check[i])
cout << i << '\n';
}
return 0;
}
두 가지 풀이를 비교해본 결과, 에라토스테네스의 채를 이용하는 방법이 훨씬 적은 시간동안 문제를 해결할 수 있다는 점을 증명할 수 있었다.
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
728x90