# 백준 : 소수 구하기(1929)
문제
https://www.acmicpc.net/problem/1929소스
(Github: https://github.com/wonjnlee/wallydev/edit/master/bj_1929_Eratosthenes'%20sieve)#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main(void) {
int start, end;
int arr[1000001];
//int number, index;
cin>>start;
cin>>end;
arr[0] = 1;
arr[1] = 1;
for(int i=2; (i*i)<=end; i++) {
for(int j=0; i*(i+j)<=end; j++) {
arr[i*(i+j)] = 1;
}
}
for(int i=start; i<=end; i++) {
if(arr[i] == 0) cout<<i<<'\n';
}
return 0;
}
풀이
진짜 겁나 짜증이나는데 왜 계속 시간초과가 나는지 도저히 모르겠지만, 우선 내 실력이 부족하다고 생각하고 자그마치 2시간 이상을 매달렸는데 왜 계속 시간초과가 나는지 도무지 모르겠다.각설하고, 무려 정답률 30%에 육박하는 엄청난 문제라서 패기넘치게 도전했다. 정답입니다!가 뜨면 블로그에 올리려고 했지만 그러다가는 내 속이 먼저 터져버릴것 같아서 우선 블로깅한다.
'에라토스테네스의 체'는 소수를 구하는 굉장히 효율적인 방법 중 하나로 소개된다.
자세한 설명은 이곳을 참조하면 된다.
또 다른 설명이 필요하다면 이곳도 참조하면 된다.
소수의 배수를 각각 지워내다보면 결국 남는건 소수뿐이라는 굉장히 단순한 방법이다.
문제는 중복되는 수가 존재하기 마련(15는 3의 배수이면서도 동시에 5의 배수)인데, 이 부분이 알고리즘 계산에는 치명적일 수 있다.
친절하게도 이 부분은 조금만 생각해보면 알 수 있는데, 우선 내가 사용한 계산식은 다음과 같다.
숫자 n에 대해서는 n*n + n*i (0<=i<=max)로 구하면 된다.
즉 숫자 3이 주어졌을 때, 계산은 3*3+0, 3*3+3, 3*3+3*2 등으로 하면된다.
이 와중에 슈밤 답을 맞췄다!! endl를 쓰면 안된다.
endl... endl.... '\n'을 써야 한단다. 알려주신 분 너무 감사해요..
댓글
댓글 쓰기