문제 링크 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;
}

댓글남기기