Dlise
시원한 냉장고
Dlise
전체 방문자
오늘
어제
  • 시원한 냉장고 (136)
    • Java (31)
      • Java (26)
      • Spring (5)
    • Algorithm & PS (25)
      • Algorithm (14)
      • Problem Solving (11)
    • Network (12)
    • Database (2)
    • Data Structure (4)
    • OOP & CleanCode (5)
    • Web (0)
    • Git (2)
    • AI (2)
    • Project (1)
      • Discord Bot (1)
    • Error (19)
    • Tools (5)
    • 수학 (5)
      • 확률과 통계(기초) (5)
    • 컴퓨터 구조 (3)
    • 활동 (20)
      • 행사 & 여행 (10)
      • 자격증 (4)
      • 회고 (6)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 통계학
  • 중위 표기법
  • java
  • spring security in action second edition
  • 가장쉬운알고리즘책
  • 백준
  • 후위 표기법
  • CleanCode
  • 열혈강의자료구조
  • 네트워크

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dlise

시원한 냉장고

Algorithm & PS/Algorithm

알고리듬 - 소수 구하기(에라토스테네스의 체)

2023. 8. 30. 13:46

코딩 테스트 문제를 푸는 중 소수를 구해야 하는 상황이 종종 있어서 소수를 구하는 방법을 정리하고자 한다.

 

에라토스테네스의 체

에라토스테네스의 체는 소수를 구하는 대표적인 방법이다.

해당 방법은 수학자 에라토스테네스가 발견한 것으로 동작 과정은 아래와 같다.

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 에라토스테네스의 체 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수

ko.wikipedia.org

위 그림을 보면 쉽게 이해할 수 있는데 2부터 시작해 N까지 배수를 지워나가는 형식이다.

 

여기서 중요한 점은 배수를 지우는 작업을 2 ~ 10까지만 진행하고 11부터는 모두 소수 처리를 했다는 것인데,

그 이유는 √N = √120 < 11이기 때문이다.

 

11부터 계산하지 않는 이유는

11의 배수를 파악하기 위해선 11 * 2, 11 * 3, ..., 11 * 10까지 11에 2 ~ 10을 곱해야 하는데

이는 모두 2 ~ 10의 배수이기 때문이다.

 

구현

내용이 어렵지 않으므로 바로 구현해 보았다.

 

인스턴스 변수 & 생성자

최댓값 n을 받으면 배열을 초기화하고 메서드를 불러온다.

    int[] prime;
    Eratosthenes(int n) {

        prime = new int[n + 1];

        for(int i = 0; i <= n; i++)
            prime[i] = i;

        primeCheck();
        print();
    }

 

primeCheck() & print() 메서드

    void primeCheck() {
        for(int i = 2; i <= Math.sqrt(prime.length - 1); i++) {
            
            if(prime[i] != 0)
                for(int j = i + i; j <= prime.length - 1; j += i)
                    prime[j] = 0;
        }
    }
    
    void print() {
        System.out.print("소수: ");
        for(int i = 2; i < prime.length; i++)
            if(prime[i] != 0)
                System.out.print(prime[i] + " ");
    }

√n까지만 돌면서 만약 지우지 않은 값이면 해당 값의 배수를 지운다.

print()에선 0, 1을 제외해야 하므로 int i = 2부터 시작한다.

 

아래는 결과이다.

전체 코드

더보기
package practice;

public class IsPrime {
    public static void main(String[] args) {
        new Eratosthenes(200);
    }
}
class Eratosthenes {
    int[] prime;
    Eratosthenes(int n) {

        prime = new int[n + 1];

        for(int i = 0; i <= n; i++)
            prime[i] = i;

        primeCheck();
        print();
    }

    void primeCheck() {
        for(int i = 2; i <= Math.sqrt(prime.length - 1); i++) {
            
            if(prime[i] != 0)
                for(int j = i + i; j <= prime.length - 1; j += i)
                    prime[j] = 0;
        }
    }

    void print() {
        System.out.print("소수: ");
        for(int i = 2; i < prime.length; i++)
            if(prime[i] != 0)
                System.out.print(prime[i] + " ");
    }
}

 

아래는 에라토스테네스의 체를 이용할 수 있는 문제이다.

https://school.programmers.co.kr/learn/courses/30/lessons/12921

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

에라토스테네스의 체는 일반적으로 시간복잡도 O(n log (log n))를 가진다.

'Algorithm & PS > Algorithm' 카테고리의 다른 글

알고리듬 - 순위 매기기  (0) 2023.09.16
알고리듬 - 최대 공약수 & 최소 공배수 구하기(유클리드 호제법)  (0) 2023.08.30
알고리듬 - 깊이 우선 탐색, 너비 우선 탐색  (0) 2023.08.28
알고리듬 - 합병, 퀵, 기수 정렬  (1) 2023.08.25
알고리듬 - 버블, 선택, 삽입 정렬  (0) 2023.06.27
    'Algorithm & PS/Algorithm' 카테고리의 다른 글
    • 알고리듬 - 순위 매기기
    • 알고리듬 - 최대 공약수 & 최소 공배수 구하기(유클리드 호제법)
    • 알고리듬 - 깊이 우선 탐색, 너비 우선 탐색
    • 알고리듬 - 합병, 퀵, 기수 정렬
    Dlise
    Dlise

    티스토리툴바