본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 15965번 : K번째 소수

by Haren 2023. 3. 24.

문제

다음은 한결이가 거울과 한 얘기중 일부이다.

  • 한결 : 난 아무리 생각해도 기억력이 좋은 것 같아!
  • 거울 : 양심없니?
  • 한결 : 이걸 못 믿니? 너무 어이없네 ㅋㅋ
  • 거울 : ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ
  • 한결 : 하.. 이걸 못 믿네; 내 머릿속에 지금 모든 소수가 차례대로 들어가 있거든? 니가 원하는 번째의 소수를 대답해줄게
  • 거울 : 그럼 k번째 소수가 뭔데??
  • 한결 : k번째 소수는....

솔직히 한결이는 기억력이 쓰레기다. 그래서 소수를 외우고 있지 못하다. 하지만 이렇게 허세를 부리고 나니 거울한테 참교육을 시전해주고 싶었다. 한결이를 도와 k번째 소수를 알려주자.

소수의 정의는 다음과 같다.

2 이상의 자연수 N이 1과 N을 제외하고 어떤 자연수로도 나누어 떨어지지 않을 때 소수라고 한다.

입력

자연수 K가 주어진다.(1 ≤ K ≤ 500,000)

출력

K번째 소수를 출력하자.

서브태스크 1 (5점)

  • K ≤ 5000

서브태스크 2 (20점)

  • K ≤ 40000

서브태스크 3 (75점)

문제에서 주어진 제약 조건 외 조건 없음

Solved.ac 레벨

실버 II

풀이

#include <bits/stdc++.h>
#define MAX 7500000

using namespace std;


bool primeNum[MAX];

void eratos(){
    for(int i = 2; i <= MAX; i++){
        primeNum[i] = true;
    }

    for(int i = 2; i * i <= MAX; i++){
        if(primeNum[i]){
            for(int j = i * i; j <= MAX; j += i){
                primeNum[j] = false;
            }
        }
    }
}

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

    int k;
    vector<int> prime;

    cin >> k;

    eratos();

    for(int i = 2; i <= MAX; i++){
        if(primeNum[i]){
            prime.push_back(i);
        }
    }

    cout << prime[k - 1] << "\n";

    return 0;
}

 

 

15965번: K번째 소수

자연수 K가 주어진다.(1 ≤ K ≤ 500,000)

www.acmicpc.net