🍞 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;
}