문제 링크 https://programmers.co.kr/learn/courses/30/lessons/12921
문제
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.)
제한 조건
n은 2이상 1000000이하의 자연수입니다.
풀이 과정
이 문제는 에라토스테네스의 체 알고리즘을 활용하는 문제이다.
효율성 테스트를 넘어가기 위해서 소수 찾기 문제들은 다 에라토스테네스의 체를 사용해야 하는 것 같다.
풀이1
#include <string>
#include <vector>
#include <cmath>
using namespace std;
const int NUM = 1000001;
int prime[NUM];
void PrimeNum(){
for(int i = 2; i <= NUM; i++){
prime[i] = i;
}
for(int i = 2; i <= sqrt(NUM); i++){
if(!prime[i]) continue;
for(int j = i * i; j <= NUM; j += i){
prime[j] = 0;
}
}
}
int solution(int n) {
int answer = 0;
PrimeNum();
for(int i = 2; i <= n; i++){
if(prime[i]) answer++;
}
return answer;
}
풀이2
#include <string>
#include <vector>
using namespace std;
const int NUM = 1000001;
int prime[NUM];
// sqrt함수 구현
int sqrt(int n){
int s = 0;
int t = 0;
s = n / 2;
while(s != t){
t = s;
s = ((n / t) + t) / 2;
}
return s;
}
void PrimeNum(){
for(int i = 2; i <= NUM; i++){
prime[i] = i;
}
for(int i = 2; i <= sqrt(NUM); i++){
if(!prime[i]) continue;
for(int j = i * i; j <= NUM; j += i){
prime[j] = 0;
}
}
}
int solution(int n) {
int answer = 0;
PrimeNum();
for(int i = 2; i <= n; i++){
if(prime[i]) answer++;
}
return answer;
}
댓글남기기