프로그래머스/lv1

프로그래머스 : 연습문제 소수 찾기(lv1) c++

TIN9 2023. 5. 24.
반응형

프로그래머스 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12921

 

프로그래머스

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

programmers.co.kr

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건
  • n은 2이상 1000000이하의 자연수입니다.
입출력 예nresult
10 4
5 3

코드 풀이

첫 풀이는 일반적인 소수 판별식으로 구현했다가  효율성에서 빠꾸먹어서 다음 풀이는 에라토스테네스의 체를 활용하여 풀었다.

에라토스테네세스의 체 풀이 방식

1. 소수인지 아닌지 판별을 저장할 배열을 선언(n의 최대 범위가 백만이기 때문 벡터로 구현)

2. 2부터 sqrt(n)의 범위까지 탐색을 한다

3. 가장 작은 숫자부터 소수라 가정하고 그 이후 * 2 해준 녀석들은 소수가 아니므로 배열에 true저장

4. 그 다음 가장 작은 숫자가 소수가 아니라면 (이전 배열들의 * 했을때 나오지 않은 값) 해당 숫자는 소수라 생각하고

그 녀석의 배수는 소수가 아니기에 배열에 true 저장

5. 반복 후 마지막에 배열을 순차적으로 탐색하며 소수의 개수 판별

코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;


int solution(int n) {
    int answer = 0;
    
    vector<bool> Save;
    
    Save.resize(n + 1);
    
    // 에라토스테네스의 체
    for(int i = 2; i < sqrt(n); ++i)
    {
        if(!Save[i])
        {
            for(int j = i + i; j <= n; j += i)
            {
                Save[j] = true;
            }
        }
    }
    
    for(int i = 2; i <= n; ++i)
    {
        if(!Save[i])
        {
            ++answer;
        }
    }
    
    return answer;
}
반응형

댓글