문제
https://www.acmicpc.net/problem/2960
풀이
일단 1000개 밖에 없으므로 각 index가 탐색이 되었는지 여부를 확인하는 배열을 만들어서 0으로 초기화 하고 탐색됐으면 1로 바꿔준다.
아이디어는, 가령 2를 먼저 선택했을 때, 2, 4, 6, 8 ... 즉 2의 배수는 전부 탐색완료 상태로 만들어주고 다시 처음으로 돌아가면 가장 작은 소수는 3이 될 것이다. 역시 3의 배수를 전부 탐색 완료로 바꿔주고 다시 처음으로 돌아가면 이미 4는 탐색완료 상태이므로 다음 수는 5가 될 것이다. 이런식으로 소수의 배수들을 전부 탐색 완료 상태로 바꿔줘가면 찾고자 하는 수를 찾을 수 있다. 이 때, 한번의 탐색에 cnt는 1씩 증가한다. (k번째를 지우는 것이므로)
소스코드
//
// 2960.cpp
// test
//
// Created by 신기열 on 27/06/2019.
// Copyright © 2019 신기열. All rights reserved.
//
#include <stdio.h>
#include <iostream>
using namespace std;
int Sieve[1001] = { 0, };
int main(){
int N, K, flag = 0, ans = 0, cnt = 0; cin >> N >> K;
for(int i = 2; i <= N; i++){
if(Sieve[i] == 0){
cnt++;
Sieve[i] = 1;
int j = 1;
if(flag == 1){ ans = i; break; }
while(i * j <= N){
if(Sieve[i * j] == 0){ Sieve[i * j] = 1; cnt++; }
if(cnt == K){ ans = i * j; flag = 1; break; }
j++;
}
}
if(flag == 1) break;
}
cout << ans;
return 0;
}
소스코드 : https://github.com/betterafter/BaekJoon/blob/master/Erato/2960.cpp
댓글
댓글 쓰기