이 영역을 누르면 첫 페이지로 이동
codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

페이지 맨 위로 올라가기

codesche's blog

소수(Prime Number) - 에라토스테네스의 체 (Java)

  • 2022.12.18 18:57
  • 알고리즘 지식/자료구조

 

○ 소수

- 1과 자기 자신만을 약수로 가지는 수

 

 

○ 소수 구하기 - 에라토스테네스의 체

소수 관련 문제를 풀 때 가장 자주 사용되는 방법은 에라토스테네스의 체이다. 

다음은 에라토스테네스의 체는 소수를 찾는 간단한 알고리즘을 시각적으로 표현한 것이다. (위키피디아 참고)

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

○ 에라토스테네스의 체 구현

2부터 시작하여 자신의 배수가 되는 수를 지워나가면 되는데 만약 120까지의 소수를 구한다고 하면

이므로 11보다 작은 수의 배수들만 지워도 충분하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Prime {
 
    public static void main(String[] args) {
        int n = 120;
        boolean[] isPrime = new boolean[n+1];
        Arrays.fill(isPrime , true);
        
        // 소수는 true
        // 0, 1은 소수가 아니므로 false
        isPrime [0] = isPrime [1] = false;
        for(int i = 2; i * i <= n; i++){
            // 만약 i가 소수 혹은 아직 지워지지 않았다면
            if (isPrime[i]){
                // i의 배수 j들에 대해 isPrime[j] = false; 로 둔다.
                // i*i미만의 배수는 이미 지워졌으므로 신경쓰지 않는다.
                for(int j=i * i; j <= n; j += i) {
                    isPrime[j] = false;                
                }
            }        
        }    
        // 1 ~ 120 사이의 소수 출력
        for(int i = 1; i <= n ;i++){
            if(isPrime[i]) System.out.print(i + " ");        
        }
    }
}
Colored by Color Scripter
cs

1) 지워지지 않은 수를 찾을 때 n이 아니라 n의 1/2제곱까지만 찾는다. 이것은 위의 소수 판정 알고리즘과 동일한 방식이다.

2) i의 배수들을 모두 지울 때 i * 2에서 시작하지 말고 i * i에서 시작한다. 2 * i는 이미 2의 배수를 지울 때 지워졌고

   3 * i는 이미 3의 배수를 지울 때 지워졌기 때문이다.

3) i * k (k < i)까지는 이미 검사되었으므로 j시작 값은 i * 2에서 i * i로 개선할 수 있다. (k의 최댓값은 i - 1이므로)

4) 만약 isPrime[i]가 true이면, i 이후의 i 배수는 약수로 i를 가지고 있는 것이 되므로 모두 true값을 준다.

5) 만약 isPrime[i]가 false이면, i는 이미 소수가 아니므로 i의 배수 역시 소수가 아니게 되므로 검사하지 않아도 된다.

'알고리즘 지식 > 자료구조' 카테고리의 다른 글

[자료구조]슬라이딩 윈도우 With 투 포인터  (0) 2022.12.26
[자료구조]브루트 포스  (2) 2022.12.25
[자료구조]투 포인터  (2) 2022.12.24
[자료구조]스택(Stack), 큐(Queue)  (1) 2022.12.23
[자료구조] 배열(Array)  (0) 2022.12.23

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [자료구조]브루트 포스

    [자료구조]브루트 포스

    2022.12.25
  • [자료구조]투 포인터

    [자료구조]투 포인터

    2022.12.24
  • [자료구조]스택(Stack), 큐(Queue)

    [자료구조]스택(Stack), 큐(Queue)

    2022.12.23
  • [자료구조] 배열(Array)

    [자료구조] 배열(Array)

    2022.12.23
다른 글 더 둘러보기

정보

codesche's blog 블로그의 첫 페이지로 이동

codesche's blog

  • codesche's blog의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (76)
    • Algorithm (15)
      • 백준 (3)
      • 프로그래머스 (10)
      • inflearn 알고리즘(Java) (2)
    • 블로그소개 (1)
    • Back-End (11)
      • Java (10)
      • SpringBoot (1)
    • Database (2)
      • MySQL (0)
      • MariaDB (1)
      • Redis (0)
      • 개념, 이론 (1)
    • Front-End (0)
      • html, css, javascript (0)
    • Git (2)
    • 알고리즘 지식 (11)
      • 자료구조 (11)
    • Study Cafe (21)
      • 기술면접 (6)
      • Clean Code 스터디 (14)
      • CS 스터디 (0)
      • 개발용어 (1)
    • 주간 에세이 (10)
    • DevOps (3)
      • 배포, Front&Back 연동 (1)
      • AWS (0)
      • Docker (1)
      • 이론 (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 개발자 현실
  • 주간에세이
  • git commit
  • 자바 변수
  • 자바 기초
  • 자료구조
  • java
  • 클린코드

나의 외부 링크

정보

The Code의 codesche's blog

codesche's blog

The Code

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © The Code. Designed by Fraccino.

티스토리툴바