Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 비트마스크
- 크루스칼
- SSAFY
- 분할 정복
- 메모리풀
- 중복 순열
- 순열
- 재귀
- 완전 탐색
- 문자열
- 큐
- 빠른 입출력
- 시뮬레이션
- 우선순위 큐
- BFS
- DP
- 그리디
- Knapsack
- 스택
- lis
- 이분 탐색
- 세그먼트 트리
- 링크드리스트
- MST
- BeautifulSoup
- 클래스
- 피보나치 수
- 백트래킹
- 조합
- dfs
Archives
- Today
- Total
작심 24/7
[백준] 1929번 소수 구하기 본문
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
처음엔 원래 소수 구하던 방식으로 짰는데 자꾸 시간 초과가 되길래
효율적으로 소수 짜는 법을 검색해보니 에라토스테네스의 체 알고리즘이 나왔다.
2부터 원하는 범위까지의 수를 배열에 넣고
소수가 아닌 수들을 체크하는 방식이다.
2의 배수들을 체크
3의 배수들을 체크
4는 2의 배수로 체크가 되어 있어 넘어간다
5의 배수들을 체크
...
이런 식으로 나아가며 체크되지 않은 수들이 소수이다.
물론 무작정 이중 for문으로 가차 없이 돌려버리면 최악의 시간이 나온다.
안쪽 for문의 증감식을 변형시켜 i의 배수만 체크할 수 있도록 만들고
이미 체크되어 있는 수들은 continue로 먹금 시켜주면 최선의 알고리즘을 만들 수 있다.
#include <iostream>
using namespace std;
int arr[1000001] = { 0 };
int main() {
int M, N;
cin >> M >> N;
arr[1] = -1;
for (int i = 2; i <= N; i++) {
if (arr[i] == -1)continue;
for (int j = i; j <= N; j += i) {
if (j != i && j % i == 0)arr[j] = -1;
}
}
for (int i = M; i <= N; i++) {
if (arr[i] == 0)cout << i << "\n";
}
return 0;
}
'백준' 카테고리의 다른 글
[백준] 2447번 별 찍기 - 10 (2) | 2020.05.20 |
---|---|
[백준] 1002번 터렛 (3) | 2020.05.20 |
[백준] 1193번 분수찾기 (0) | 2020.05.20 |
[백준] 11720번 숫자의 합 (0) | 2020.05.20 |
[백준] 15552 빠른 A+B (0) | 2020.05.20 |
Comments