코테/백준

[백준/JAVA] 1929번: 소수 구하기

imname1am 2023. 4. 25. 12:36
반응형

🔺 문제

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

 

🔺 코드

- 풀이1) int 배열 활용

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        int[] A = new int[N + 1];
        
        // 각 인덱스 값으로 초기화
        for(int i = 2 ; i <= N ; i++) {
            A[i] = i;
        }
        
        for(int i = 2 ; i <= Math.sqrt(N) ; i++) {
            if(A[i] == 0)
                continue;
            
            // 배수 지우기
            for(int j = i + i ; j <= N ; j += i) {
                A[j] = 0;
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i = M ; i <= N ; i++) {
            if(A[i] != 0) {
                sb.append(A[i]).append("\n");
            } 
        }
        System.out.println(sb);
    }
}
cs

 

 

 

- 풀이2) boolean 배열 활용

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        boolean[] isPrime = new boolean[N + 1];
        Arrays.fill(isPrime, true);
        
        isPrime[0= isPrime[1= false;
        
        // 배수 지우기
        for(int i = 2 ; i <= Math.sqrt(N) ; i++) {
            // 이미 체크된 배열이면, 다음 반복문으로 skip
            if(!isPrime[i])
                continue;    
            for(int j = i * i ; j <= N ; j += i)
                isPrime[j] = false;
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i = M ; i<= N ; i++) {
            if(isPrime[i]) {
                sb.append(i + "\n");
            } 
        }
        System.out.println(sb);
    }
}
cs
 
✅ 해결 아이디어
✔ 소수 찾기 - 에라토스테네스의 체

 

💥 유의사항

⇨ 배수 지우는 부분 - 2번째 for문의 증감식 부분 j += i

⇨ i * i 미만의 변수는 이미 지워졌으므로 신경 안 씀.

 


🔺 다른 풀이들

 

백준 1929번 자바 문제 답/해설(소수 구하기 문제)

[1] 백준 카테고리 단계별로 풀어보기 기본 수학 2 4단계 1929번 문제 소수 구하기 [2] 문제 1. 입력 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소

engpro.tistory.com

 

[백준] 1929번 : 소수 구하기 - JAVA [자바]

https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다. www.acmicpc.n

st-lab.tistory.com


💬 느낀 점

오랜만에 보는 에라토스테네스의 체 반갑

 

1회독 2회독 3회독 4회독 5회독
V 6/12 6/20    

 

(+6/12 2회독)

으아 오랜만에 혼자서 짜려니 또 까먹는다

이 망각의 곡선아,,,,ㅠ

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        StringBuilder sb = new StringBuilder();
        
        int m = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        
        boolean[] isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        isPrime[0= isPrime[1= false;
        
        for(int i = 2 ; i <= n ; i++) {
            if(isPrime[i]) {
                for(int j = i + i ; j <= n ; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        
        for(int i = m ; i <= n ; i++) {
            if(isPrime[i]) sb.append(i).append("\n");
        }
        System.out.println(sb);
    }
}
cs

 

(+6/20 3회독)

boolean 배열로 소수 판별 배열을 만들었다.

더보기
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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        StringBuilder sb = new StringBuilder();
        
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        
        boolean[] A = new boolean[N + 1];
        Arrays.fill(A, true);
        A[0= A[1= false;
        
        for(int i = 2 ; i <= (int)Math.sqrt(N) ; i++) {
            for(int j = i * i ; j <= N ; j += i) {
                A[j] = false;
            }
        }
        
        for(int i = M ; i <= N ; i++) {
            if(A[i]) {
                sb.append(i).append("\n");
            }
        }
        System.out.println(sb);
    }
}
cs

(참고)

✔ 에라토스테네스의 체 (boolean ver.)

 

[알고리즘] 소수(Prime Number) 구하기 - 에라토스테네스의 체 (Java)

소수 소수(prime number)는 정수론의 가장 중요한 연구 대상 중 하나로, 양의 약수가(1보다 큰 자연수) 1과 자기 자신만을 약수로 가지는 수를 의미한다. 소수의 반대말로, 세 개 이상의 양의 약수를

loosie.tistory.com

 

JAVA [자바] - 소수 구하는 알고리즘 및 구현

들어가기 전에 소수 [Prime Number] 소수의 정의는 1보다 큰 자연수 중 1 과 그 수 자기 자신만을 약수로 갖는 자연수를 의미한다는 점은 누구나 알고 있을 것이다. 즉, 소수의 약수는 2개만을 갖고,

st-lab.tistory.com

 

반응형