소수 찾기 (에라토스테네스의 체)

2025. 4. 17. 18:10·Algorithms

주어진 숫자 하나가 소수인지 아닌지 판단하는 함수

2부터 N까지 전부 순회하면서 isPrime이 true를 반환하면 개수가 증가하는 방식이다. √num까지만 확인해 봐도 충분하다.

하지만 N이 100만 정도라면, 이 방식은 O(N√N)이라서 느릴 수 있다.

class Solution {
    static boolean isPrime(int num) {
        if (num < 2) return false;
        for (int i=2; i*i<=num; i++)
            if (num % i == 0) 
                return false;
    }

    public int solution(int n) {
        int cnt = 0;
        for (int i=2; i<=n; i++)
            if (isPrime(i)) cnt++;
        return cnt;
    }
}

에라토스테네스의 체

성능을 고려하면 에라토스테네스의 체가 더 효율적이다. 이는 boolean 배열 기반의 함수로 구현한다.

에라토스테네스의 체가 무엇인지 궁금하다면? https://www.youtube.com/watch?v=oYj_rwUpncM

 

에라토스테네스의 체는 O(NloglogN)​의 시간복잡도를 가진다. (O(NloglogN) 정도면 O(N)이랑 비슷하지만 약간 더 느린 정도로, 거의 선형에 가깝다고 한다. 극한의 효율!)

class Solution {
    public int solution(int n) {
        // 에라토스테네스의 체
        boolean[] isNotPrime = new boolean[n+1];
        for (int i=2; i*i<=n; i++)
            if (!isNotPrime[i])
                for (int j=i*i; j<=n; j+=i)
                    isNotPrime[i] = true;
        
        int cnt = 0;
        for (int i=2; i<=n; i++)
            if (!isNotPrime[i]) cnt++;
        return cnt;
    }
}
저작자표시 비영리 변경금지 (새창열림)
'Algorithms' 카테고리의 다른 글
  • 인접 행렬 vs. 인접 리스트
  • 벨만-포드 알고리즘
  • 다익스트라 알고리즘
  • Union-Find (Disjoint Set)
챙구리
챙구리
우당탕탕 개발자로 진화하기 (‘•̀ ▽ •́ )✎
  • 챙구리
    study log ꕤ*.゚
    챙구리
  • 전체
    오늘
    어제
    • ⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆ ゚ (19)
      • Spring Boot (4)
      • Database (3)
      • DevOps (4)
      • Algorithms (5)
      • 약간의 AI (0)
      • 약간의 Front-end (1)
      • etc (2)
  • 인기 글

  • 태그

    db모델링
    인텔리제이
    도커
    스프링입문
    lombok
  • hELLO· Designed By정상우.v4.10.6
챙구리
소수 찾기 (에라토스테네스의 체)
상단으로

티스토리툴바