728x90
반응형
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);
}
}
728x90
반응형
'Java > Java 알고리즘 인프런' 카테고리의 다른 글
[Ch.02 - Array] 07. 점수계산 (0) | 2022.05.18 |
---|---|
[Ch.02 - Array] 06. 뒤집은 소수 (+ 숫자 뒤집기 : while, %10, /10) (0) | 2022.05.18 |
[Ch.02 - Array] 04. 피보나치 수열 (0) | 2022.05.17 |
[Ch.02 - Array] 03. 가위 바위 보 (0) | 2022.05.17 |
[Ch.02 - Array] 02. 보이는 학생 (0) | 2022.05.17 |