1일1알고/Java Algorithm

23/02/03 [⭐Inf_0203 소수(에라토스테네스 체)]

kim chan jin 2023. 2. 3. 01:47

설명

자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.

만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다.

 

입력

첫 줄에 자연수의 개수 N(2<=N<=200,000)이 주어집니다.

 

출력

첫 줄에 소수의 개수를 출력합니다.

 

예시 입력 1 

20

 

예시 출력 1

8

 

내코드 : 풀긴 했지만 시간초과

반복문 안의 조건문 안의 반복문 안의 조건문...

import java.util.Scanner;

public class Main {
    //        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  총21개
    // int[] [0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0]
    // int[] [1 1 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0]

    public int solution(int n){
        int answer = 0;
        int[] ia = new int[n+1];
        ia[0] = 1; ia[1] = 1; // 0과 1은 소수가 아님을 표시

        for(int i=0; i<=n; i++){
            if(ia[i] == 0){ // 소수라면
                answer++; // 카운트하고
                ia[i] = 1; // 소수로 판단했음을 표시
                for(int j=i+1; j<=n; j++){ // 자신의 배수를 찾기 위한 반복문
                    if(j%i == 0){ // 만약 자신의 배수면
                        ia[j] = 1; // 소수가 아님을 표시
                    }
                }
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Main m = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(m.solution(n));
    }
}

 

강의코드

기억할 것

배열의 모든 요소를 검사하면서 자신의 배수인지 판단하는 것은 비효율적임.

반복문을 돌릴 때 자신의 배수만 검사하고 소수가 아님을 표시하도록 설정. for(int j=i; j<=n; j=j+i){ ia[j] = 1; }

import java.util.Scanner;

public class Main {
    //        0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  총21개
    // int[] [0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0]
    // int[] [1 1 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0]

    public int solution(int n){
        int answer = 0;
        int[] ia = new int[n+1];

        for(int i=2; i<=n; i++){ // 애초에 2부터 시작
            if(ia[i] == 0){ // 소수라면
                answer++; // 카운트
                for(int j=i; j<=n; j=j+i){ // 배열 모든 요소들을 검사하는 것이 아니라 자신의 배수만 검사
                    ia[j]=1; // 소수가 아님을 판단
                }
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Main m = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(m.solution(n));
    }
}