Algorithm

[백준 1929] 소수 구하기

moguogu 2021. 7. 29. 14:44

문제설명

image

M,N을 입력받고, 그 범위내의 소수를 구해서 출력한다.


알고리즘

  1. N,M을 입력 받는다.
  2. bool type의 배열을 N+1만큼 만들고, 1로 초기화 시킨다.
  3. 0번째와 1번째는 false로 초기화 해준다.
  4. 소수를 구하기 위해서 에라토스테네스의 체 알고리즘을 사용한다.

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int M,N;
    cin >>M>> N;

    bool *arr = new bool[N+1];
    fill_n(arr, N + 1, 1);//초기화
    arr[0] = false;
    arr[1] = false;

    for (int i= 2; i <=sqrt(N);  i++)//소수구하기
    {
        if (arr[i])
        {
            for (int j=2*i; j <= N; j+=i)
                arr[j] = false;
        }
    }

    for (int i = M; i <= N; i++)//소수 출력
    {
        if (arr[i])//소수인 경우
            cout << i << "\n";
    }

    delete[] arr;

    return 0;
}

풀이

시간 복잡도: O(n*log(log(n)))

고찰

에라토스테네스의 체를 사용하지 않으면 시간 초과가 발생하는 문제였다.

'Algorithm' 카테고리의 다른 글

[백준 6198] 옥상 정원 꾸미기  (0) 2021.07.29
[백준 7562] 나이트의 이동  (0) 2021.07.29
[백준 11279] 최대 힙  (0) 2021.07.29
[백준 11399] ATM  (0) 2021.07.29
[백준 11726] 2xN 타일링  (0) 2021.07.29