본문 바로가기
알고리즘 문제풀이

[프로그래머스] 알고리즘 72일차 : 소수 찾기

by SiO2whocode 2021. 1. 26.
728x90

programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

C++ 소수 <에라토스테네스의 체>

프로그래머스 코데 연습 문제 level 1

정해진 범위 내에서 소수 개수 찾는 문제인데 단순하게 풀면 시간초과 나서

에라토스테네스의 채로 풀어야 하는 문제

평소에 잘 안쓰는 함수를 써봤다.

 

오답노트

에라토스테네스 체로 제출했는데도 효율성검사에서 걸렸었는데

틀린 부분은 가장 바깥 반복문 돌때 어차피 배수를 지워나가는거라 반 이상은 돌 필요 없는걸 간과해서

일단 그 부분 고쳤고

그 다음엔 배열상 소수라고 되어있는 것은 아직 확인이 안된거라 다시 소수인지 확인해봐야 한다고 생각했는데

사실 2부터 시작해서 소수의 배수를 지워가는 거라면 당연히 소수가 아니라고 체크되지 않은 수는 소수이기 때문에

그 부분도 지워서 제출하고 통과 (에라토스테네스의 체로 이전에 풀었던 코드가 있어서 내껄 내가 참고함..)

 

소스코드

#include <string>
#include <vector>

using namespace std;

bool isPrime[1000001];
void updateIsPrime(int n,int end){
    for(int i = n*2 ; i <= end ; i += n){
        isPrime[i] = false;
    }
}
int solution(int n) {
    int answer = 0;
    for(int i = 2 ; i <= n ; i++ ){
        isPrime[i] = true;
    }
    for(int i = 2 ; i <= n/2 ; i++){
        if(!isPrime[i]){
            continue;
        }else{
            updateIsPrime(i,n);
        }
    }
    for(int i = 2 ; i <= n ; i++){
        if(isPrime[i]){
            answer++;
        }
    }
    return answer;
}
728x90