[백준/C++] 1929번 소수 구하기

2021. 2. 3. 00:01알고리즘/구현

728x90
반응형

문제: www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

 

문제풀이

 

처음 문제를 풀 땐 브루트 포스로 문제를 풀었다.

하지만 범위가 1 ≤ M ≤ N ≤ 1,000,000 으로 큰 숫자여서 시간 초과가 나왔다.

 

이 문제는 "에라토스테네스의 체" 라는 알고리즘으로 풀어야 한다.

 

입력 범위만큼 배열을 선언하고

숫자 2부터 해당 숫자를 제외한 배수를 인덱스로 가지고 있는 배열을 1로 초기화한다.

 

배열 크기만큼 반복한 후 배열에 0이 있으면 해당 배열의 인덱스를 출력한다.

이때, 숫자 1은 소수가 아니므로 arr[1]은 1로 따로 초기화시켜주어야 한다.

 

에라토스테네스의 체, 위키백과

코드

#include <iostream>

using namespace std;

int main(){
    ios::sync_with_stdio(false); cin.tie(NULL);

    int M,N;
    cin>>M>>N;

    int arr[N+1]={0,}; //N+1 크기의 배열 선언
    arr[1] = 1; //1은 소수이므로 1로 초기화 해준다.
    for(int i=2; i<=N; i++){ //숫자 2부터
        for(int j=2; i*j<=N; j++){
            arr[i*j] = 1; //i의 j배수 이므로 소수가 아니다. -> 1로 초기화
        }
    }


    for(int i=M; i<=N; i++){
        if(arr[i] == 0) //0이면 출력
            cout<<i<<"\n";
    }

    return 0;
}

 

 

결과

728x90
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준/C++] 2108번 통계학  (0) 2021.02.04
[백준/C++] 2164번 카드2  (0) 2021.02.03
[백준/C++] 10989번 수 정렬하기 3  (0) 2021.02.03
[백준/C++] 15829번 Hashing  (0) 2021.02.02
[백준/C++] 1966번 프린터큐  (1) 2021.01.29