본문 바로가기
Preparing Coding Test/Programmers L1

[Java] 소수 찾기

by weero 2020. 8. 3.

문제

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