[프로그래머스Lv1] 소수 찾기

JinjuLog·2021년 2월 7일
0

알고리즘

목록 보기
6/12
post-thumbnail

🚩 문제 설명

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

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

📝 해결방법

간단한 문제 같은데 계속 시간초과가 걸리게 된다. 검색한 결과 에라토스테네스의 체라는 소수를 찾는 방법을 이용해야 한다.

📝 배운것

에라토스테네스의 체 알고리즘

출처 : 에라토스테네스의 체

👩🏻‍💻 내코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        int cnt = 0;
        
        for(int i=2; i<=n; i++){
            cnt = 0;
            for(int j=2; j<=i; j++){
                if(i%j == 0){  //약수 구하기                 
                    cnt++;                    
                }
                if(cnt>=2) break;
            }
            if(cnt==1) answer++;
        }
        return answer;
    }
}

제한조건에 n은 2이상 1000000이하의 자연수입니다. 때문에 효율성에 문제가 생긴다..

📝 개선사항

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        int[] number = new int[n+1];
        
        //number 배열에 넣어주기
        for(int i=2; i<=n; i++){
            number[i] = i;
        }
        
        //배수들 0만들기
        for(int i=2; i<=n; i++){
            if(number[i]==0) continue;
            
            for(int j=2*i; j<=n; j +=i){
                number[j] = 0;
            }
        }
        
        for(int i=0; i<number.length; i++){
            if(number[i]!=0) answer++;
        }
        return answer;
    }
}

에라토스테네스의 체를 이용한 코드

출처 : programmers 소수찾기

0개의 댓글