본문 바로가기

코딩테스트 연습(with java)/프로그래머스

소수 찾기

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건
  • n은 2이상 1000000이하의 자연수입니다.
입출력 예

 

n                                                                                                                result

 

10 4
5 3

 

나의 코드 

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        int [] arr1 = new int[n+1];
        
        for(int i=2; i<=n; i++){
            arr1[i] = i;
        }
        //빈 배열은 continue함으로써 효율성 
        for(int i=1; i<=n; i++){
            if(arr1[i] == 0){
                continue;
            }
            //짝수 제거 
            for(int j=2*i; j<=n; j=j+i){
                arr1[j] = 0; 
            }
        }
        
        for(int i=0; i<arr1.length; i++){
            if(arr1[i]!=0){
                answer++;
            }
        }
        return answer;
    }
}

 

에라토스테네스의 체를 활용하여 문제를 풀어보았다. 숫자가 그렇게 크지는 않았기에 배열로 구현했을 때 효율성에 문제가 생기지는 않았지만, int n이 long형일 경우, 효율성에 문제가 생길 것 같다는 생각이 든다. 

또 반대로 생각드는점은, 결국 배열의 크기는 한정적이고, 배열을 통해 순차적 탐색을 하는 것도 나쁘지 않을 것이라는 생각이 드는게, 에라토스테네스의 체가 정수나 어떤 수의 배수 등을 알아서 걸러주기 때문이다 .

다른 방법이 있는지 생각을 한번쯤은 더 해보는게 좋을 것 같다.