[백준 1978] 소수 찾기
백준 1978번 - 소수 찾기
❓ 문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
예제 입력 1
4
1 3 5 7
예제 출력 1
3
✏️ 풀이
소수(Prime Number)를 찾는 문제는 에라토스테네스의 체
를 사용하면 효율이 좋다.
자세한 사항은 위키백과 - 에라토스테네스의 체 부분을 참고하면 훨씬 이해가 빠를 것이다.
쉽게 말하자면,
- 소수를 구하고자 하는 모든 수를 나열(ex 범위 1~120).
- 2부터 현재 수를 소수로 선택한 후, 자신의 모든 배수들을 지움
- 2의 배수는 전부 지워졌으니 다음 수로 넘어감
- 다음 수(3)를 현재 소수로 선택한 후, 자신의 모든 배수를 지움
- 구하고자 하는
max범위의 제곱근
까지 검사하고 난 뒤 지워지지 않고 남은 수가 소수
이러한 흐름이다.
편리하고 쉬운 이해를 위해 짧은 영상을 첨부하겠다.(출처 - 위키백과 - 에라토스테네스의 체)
결론 : 소수를 구할 때 에라토스테네스의 체 원리를 잘 알고 있다면 훨씬 수월하게 문제를 풀 수 있다.
✔️ 정답 코드
#include <iostream>
#include <vector>
using namespace std;
bool number[1001];
vector<int> input;
void setPrimeNumber();
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
setPrimeNumber();
int N;
cin >> N;
for (int i=0; i<N; i++) {
int temp;
cin >> temp;
input.push_back(temp);
}
int count=0;
for (int i=0; i<input.size(); i++) {
if (number[input[i]])
count++;
}
cout << count;
return 0;
}
void setPrimeNumber() {
number[1]=false;
for (int i=2; i<1001; i++)
number[i]=true;
for (int i=2; i*i<1001; i++) {
if (number[i]) {
for (int j=i+i; j<1001; j+=i) {
if (number[j]) {
number[j]=false;
}
}
}
}
}
Leave a comment