일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩공부
- 추리 소설
- serializer
- KITRI
- 히가시노 게이고
- 백준 알고리즘
- 백준
- 백엔드 개발
- DP
- webhacking.kr
- bob 9기 후기
- 웹 개발
- best of the best
- 알고리즘
- Django CRUD
- 독서
- bob
- 일본 소설
- Django Restful API
- Blind SQL Injection
- 정보 보안
- 백준알고리즘
- 동적 프로그래밍
- 백엔드
- 코딩
- 가가 형사 시리즈
- Django Rest Framework
- 삼성 SW 역량 테스트
- 코딩 공부
- 웹 해킹
Archives
- Today
- Total
요모조모 ʚɞ
[C] 백준 2960번 : 에라토스테네스의 체 본문
오늘은 소수 구하기 문제를 풀어보았습니다! ٩꒰。•◡•。꒱۶
그중 하나는 2960번 에라토스테네스의 체입니다.
https://www.acmicpc.net/problem/2960
에라토스테네스의 체 는 정수 범위 내에서 소수를 찾을 때 흔히 사용하는 방법입니다.
여기서 말하는 소수란 1과 자기 자신만을 약수로 가지는 수입니다. ( 반대로 소수가 아닌 수를 합성 수라고 합니다. )
그럼 주어진 수가 소수인지 합성 수인지 판단하려면,
1과 자기 자신이 아닌 다른 수의 배수가 되는지를 살펴보면 되겠죠?
에라토스테네스의 체 구현은 문제에서 주어진 방법과 같이
소수를 찾고, 그 소수의 배수를 모두 지워나가는 식으로 진행하면 됩니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int cnt = 0;
int isPrime[1001]; // 0이면 소수, 1이면 합성수
int primeSieve(int n, int k)
{
for (int i = 2; i<= n; i++)
{
if (isPrime[i]==0)
{
cnt++;
if (cnt == k)
return i;
for (int j = i * i; j <= n; j += i)
{
if (isPrime[j] == 0) {
isPrime[j] = 1;
cnt++;
if (cnt == k)
return j;
}
}
}
}
}
int main()
{
int N, K;
scanf("%d%d", &N, &K);
printf("%d\n", primeSieve(N, K));
return 0;
}
저는 위의 코드와 같이 isPrime이라는 배열을 사용하여,
index에 해당하는 수가 소수인지 합성수인 지 구분하였습니다.
원래 에라토스테네스의 체는 실행속도를 줄이기 위해
바깥 for문의 탐색 범위를 2부터 sqrt(N)까지 설정하는 경우가 많습니다.
하지만 이 문제는 소수를 지우는 경우도 고려해야 하기 때문에 2부터 N까지로 설정해 주었습니다.
.
컴퓨터에서 소수는 암호 시스템이나 데이터베이스, 파일 압축 등 다양한 분야에서 사용되고 있습니다.
또한 해시 함수를 설계할 때 충돌을 방지하기 위해 해시 테이블의 크기로 소수를 사용하기도 합니다 !
'코딩 > C' 카테고리의 다른 글
[C] 백준 7579번 : 앱 (0) | 2020.04.28 |
---|---|
[C] 백준 2994번 : 내한 공연 (1) | 2020.04.27 |
[C] 백준 1010번 : 다리 놓기 (0) | 2020.04.25 |
[C] 백준 1106번 : 호텔 (0) | 2020.04.16 |
[C] 백준 11729번 : 하노이 탑 이동 순서 (0) | 2020.04.12 |
Comments