프로그래머스 소수 찾기

최준호·2021년 7월 22일
0

algorithm

목록 보기
27/39

문제

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

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

제한사항

  • n은 2이상 1000000이하의 자연수입니다.

입출력 예

풀이

public class PrimeNumberSearch {
    public static void main(String[] args) {
        Test t = new Test();
        int n = 10;
        int solution = t.solution(n);
        System.out.println("solution = " + solution);
    }
    public int solution(int n) {
        int answer = 0;

        //에라토스테네스 체
        boolean[] isPrime = new boolean[n+1];
        isPrime [0] = true; //true일 경우 소수가 아님
        isPrime [1] = true;

        for(int i=2; i<n; i++){
            for(int j=2; i*j<=n; j++){
                isPrime[i*j] = true;
            }
        }

        for(int i=1; i<=n; i++){
            if(!isPrime[i]) answer++;
        }

        return answer;
    }
}

처음에 소수를 구하래서 쉽게 구하는 방법인

for(int i=2; i<=n; i++){
	if(n%i) return true;
}

이런식으로 하나씩 모두 나눠보는 방식으로 소수를 구했다. 이렇게 구하니까 프로그래머스에서 처음 보는 2900ms를 볼수 있었으며 시간초과와 효율성 검사에서 다 떨어졌다 ㅎㅎ... 그래서 인터넷을 찾아보니 에라토스테네스의 체 라는 방법이 있었다.

에라토스테네스 체 위키백과

위 링크에서 내용은 확인하길 바란다. 아마 내용을 보지 않고 gif만 봐도 이해할 수 있을 것이다.

다음과 같은 내용을 가지고 알고리즘으로 구현한 결과인데 사실 쉬운 문제인줄 알고 시작했다가 다른 구현 문제보다 더 어려워서 애 먹었다... 에라토스테네스의 체 개념을 이해하고 꼭 풀어보길 바란다!

에라토스테네스 체 너무 어려워 하지만 소수를 엄청 빠르게 구해주므로 꼭 알고 있자

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글