문제
https://programmers.co.kr/learn/courses/30/lessons/12921
코딩테스트 연습 - 소수 찾기
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상
programmers.co.kr
풀이
에라토스테네스의 체를 참고했다.
https://ko.wikipedia.org/wiki/에라토스테네스의_체
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수(素數, 발음: [소쑤])를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 �
ko.wikipedia.org
코드
class Solution {
public int solution(int n) {
int answer = 0;
boolean[] primes = new boolean[n+1];
//2~n
for(int i=2;i<=n; i++)
primes[i] = true;
// 2 ~ i*i <= n
// 각 배수 제거
for(int i=2; (i*i)<=n; i++){
if(primes[i]){
for(int j=i*i; j<=n; j+=i){
primes[j] = false;
//i*i 미만은 이미 처리되었으므로 j의 시작값은 i*i로 최적화
}
}
}
for(int i=0; i<=n ; i++){
if(primes[i])
answer++;
}
return answer;
}
}
www.youtube.com/watch?v=5ypkoEgFdH8
시간복잡도 O(N^(1/2))
→ 8의 경우 2 * 4 = 4 * 2와 같은 식으로 대칭을 이루기 때문에, 특정한 숫자의 제곱근 까지만 약수의 여부를 검증해도 된다.
해당 숫자가 소수인지 판별하는 코드 (C)
bool isPrimeNumber(int x){
int end = (int)sqrt(x);
for(int i=2; i<=end; i++){
if(x%i==0) return false;
}
return true;
}
대량의 소수를 한꺼번에 판별하는 코드 (C)
int number = 100000; //10만개의 숫자
int a[100001];
void primenumberSieve(){
for(int i=2; i<=number; i++){
a[i] = i;
}
for(int i=2; i<=number; i++){
if(a[i]==0) continue;
for(int j=i+i; j<=number ; j++){
a[j] = 0;
}
}
for(int i=2; i<=number ; i++){
if(a[i]!=0) printf("%d", a[i]);
}
}
'Preparing Coding Test > Programmers L1' 카테고리의 다른 글
[Java / C++] 예산 (0) | 2020.08.03 |
---|---|
[Java] 서울에서 김서방 찾기 (0) | 2020.07.31 |
[Java] 문자열 내 p와 y의 개수 (0) | 2020.07.31 |
[Java] 체육복 (0) | 2020.07.31 |
[Java] 나누어 떨어지는 숫자 배열 (0) | 2020.07.30 |