🍞 Problem Solving/Programmers

[프로그래머스][Level1] 소수 찾기 c++

박빵이 2022. 9. 2. 22:51
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이과정

이 문제는 에라토스테네스의 체 알고리즘을 활용하는 문제이다.  
효율성 테스트를 넘어가기 위해서 소수 찾기 문제들은 다 에라토스테네스의 체를 사용해야 하는 것 같다.

 

풀이 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++){
    	// prime[i]이 0이라면 이미 소수가 아니므로 넘어감
        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;
}