[프로그래머스/java] 소수 찾기 *[에라스토테네스의 체] 설명

리트리버J

·

2021. 1. 3. 18:00

728x90

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

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

 

<에라스토테네스의 체>

1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다.

2. 2는 소수이므로 오른쪽에 2를 쓴다.

3. 자기 자신을 제외한 2의 배수를 모두 지운다.

4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다.

5. 자기 자신을 제외한 3의 배수를 모두 지운다.

6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다.

7. 자기 자신을 제외한 5의 배수를 모두 지운다.

8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다.

9. 자기 자신을 제외한 7의 배수를 모두 지운다.

10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

(출처 : 위키백과)

 

<JAVA 코드 : 주석 추가>

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
27
28
29
30
31
32
33
34
35
36
37
38
package com.codeup;
 
public class CodeUp100 {
 
    public static void main(String[] args) {
        int n = 100;
        
        int answer = 0;
        
        /*     
         * 소수 → false, 비소수 → true가 된다.
         * n+1로 길이를 설정하는 이유 :
         * i가 n까지 포함되어 checked[n]으로 들어가는데,
         * 배열의 index는 length보다 1작기 때문이다.
         */
        boolean[] checked = new boolean[n+1];
        
        // 구하고자 하는 숫자까지 숫자 2부터 반복문을 실행한다. (1은 소수가 아님)
        for (int i = 2; i <= n; i++) {
            // 첫번째) 2는 소수이므로 !false → true
            // 두번째) 3은 소수이므로 !false → true
            // 세번째) 4는 비소수이므로 !true → false
            if (!checked[i]) {
                answer++;
                System.out.println(i);
            }
            // 첫번째) j += i를 통해 2의 배수들을 true로 바꾼다.
            // 두번째) j += i를 통해 3의 배수들을 true로 바꾼다.
            // 세번째) j += i를 통해 4의 배수들을 true로 바꾸지만, 이미 2의 배수로 true로 변경되었다.
            for (int j = i; j <= n; j += i) {
                if (!checked[j])
                    checked[j] = true;
            }
        }
        
        System.out.println("총 소수의 갯수 : " + answer + "개");
    }
}
cs

<나의 풀이>

에라토스테네스의 체를 활용하여 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        boolean[] check = new boolean[n+1];
        
        for(int i = 2; i <= n; i++){
            if(!check[i]) answer++;
            for(int j = i; j <= n; j += i){
                if(!check[j]) check[j] = true;     
            }
        }
        return answer;
    }
}
cs

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

728x90