본문 바로가기

Java/Java 알고리즘 인프런

[Ch.02 - Array] 05. 소수(에라토스테네스 체) #

반응형

 

5. 소수(에라토스테네스 체)
 

설명

자연수 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 {
  public static void main(String[] args){
    Scanner kb=new Scanner(System.in);
    int n = kb.nextInt();
    int answer=0;
    int tmp=0;

    for(int i=2;i<=n;i++){
     tmp=0;
      for(int j=1;j<=i;j++){
        if(i%j==0){
          tmp++;
        }
        if(tmp==3)
          break;
      }
      if(tmp==2)
          answer++;
    }
 	System.out.println(answer);
  }
}

 

import java.util.Scanner;
  
public class Main {
public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		int answer = 0;
		int tmp = 0;
		int j = 1;
		for (int i = 2; i <= n; i++) {
			j=1;
			tmp=0;
			while (j != i + 1) {
				if (i % j == 0)
					tmp++;
				if (tmp == 3)
					break;
				j++;
			}
			
			if (tmp == 2)
				answer++;
		}
		System.out.println(answer);

	}

}

 

import java.util.Scanner;
  
public class Main {
public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		int answer = 0;
		int tmp = 0;
		int j = 1;
		for (int i = 2; i <= n; i++) {
			j=2;
			tmp=0;
			while (j != i) {
				if (i % j == 0)
					tmp++;
				if (tmp == 1)
					break;
				j++;
			}
			if (tmp == 0)
				answer++;
		}
		System.out.println(answer);

	}

}

 

-> Time Limit

 

import java.util.Scanner;

public class Main {
	public int solution(int n) {
		int answer=0;
		int[] ch=new int[n+1];
		for(int i=2;i<n;i++) {
			if(ch[i]==0) {
				answer++;
				for(int j=1;j*i<n;j++) {
					ch[i*j]=1;
				}
			}
		}
		return answer;
		
	}
	public static void main(String[] args) {
		Main T=new Main();
		Scanner kb =new Scanner(System.in);
		int n=kb.nextInt();
		System.out.println(T.solution(n));
	}

}

체크 배열

int[] ch = new int[n+1]; -> n보다 1큰 배열

 

ch[i]==0이면, 소수로 카운팅하고, i의 배수에 모두 1로 설정

 

 

 

if(ch[i]==0) {
    answer++;
        for(int j=1;j*i<n;j++) {
        	ch[i*j]=1;
        }
}

 

+) 세련된 풀이

import java.util.Scanner;

public class Main {
	public int solution(int n) {
		int cnt = 0;
		int[] ch = new int[n + 1];
		for (int i = 2; i <= n; i++) {
			if (ch[i] == 0) {
				cnt++;
				for (int j = i; j <= n; j=j+i) {
					ch[j] = 1;
				}
			}
		}
		return cnt;
	}

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

 

 


에라토스테네스의 체

: 자기자신을 제외한 배수를 모두 지워가는 방식으로 n까지 소수를 구한다.

-> 자기자신을 제외한 배수를 체를 이용해 거르는 것과 같이 거르기 때문에 '체'라는 이름이 붙었다.

 

import java.util.Scanner;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    int n=in.nextInt();
    //n까지 포함하므로 n+1 길이 배열
    int cnt=0;
    int[] arr = new int[n+1];
    for(int i=2;i<=n;i++){
      //자기 자신의 경우 소수이므로 ++
      if(arr[i]==0) {
        cnt++;
        //자기자신의 배수의 경우 모두 --
        for(int j=i; j<=n;j=j+i){
          arr[j]=1;
        }
      }
    }
    System.out.println(cnt);
  }
}
반응형