반응형
문제 : M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
소수를 구하는 알고리즘은 여러 가지가 있습니다.
하지만 이 문제는 2초라는 시간제한이 있습니다. 그렇기 때문에 가장 효율적인 알고리즘을 채택해야 합니다.
예를 들어 수 하나(n)가 주어졌을 때 2부터 (n-1) 까지 나누어 본다 하면 연산횟수는 n-2 번이 될 것입니다.
하지만 나오는 수마다 일일이 계산한다면 연산은 배로 많아질 것이고, 이는 효율적이지 못합니다.
(실제로 일일이 계산하면 시간초과가 뜬다)
에라토스테네스의 채를 이용합니다. 이 알고리즘을 사용하면 시간복잡도를 줄일 수 있습니다.
2를 제외한 2의 배수를 삭제, 3을 제외한 3의 배수를 삭제... 이런 식으로 나아가면 소수만 남게 됩니다.
수가 여러개 주어졌을때도 배열에 저장만 해 둔다면 한번만 계산 해두면 다시 꺼내 쓸 수 있죠.
이걸 이용해서 코드를 짜 보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h> int arr[1000001]={1,1,1,}; int main() { int min,max,temp; scanf("%d %d",&min,&max); for(int i=2;i<=max;i++) { temp=i; while(temp+i<=max) { temp=temp+i; if(arr[temp]!=1) { arr[temp]=1; } } } if(min<=2&&max>=2) { printf("2\n"); } for(int i=min;i<=max;i++) { if(arr[i]==0) { printf("%d\n",i); } } return 0; } | cs |
반응형
'개발 지식 > 알고리즘' 카테고리의 다른 글
[백준] 1010 다리 놓기 (0) | 2019.05.08 |
---|---|
[백준] 2609 최대공약수와 최소공배수 (0) | 2019.03.24 |
[백준] 10250 ACM 호텔 (0) | 2019.03.15 |
[백준] 1834 나머지와 몫이 같은 수 (0) | 2019.02.27 |
[백준] 1152 단어의 개수 (0) | 2019.02.07 |