ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1929) 소수 구하기 - Java
    백준코딩일기 2020. 1. 29. 19:11

    문제 )

    https://www.acmicpc.net/problem/1929

     

    1929번: 소수 구하기

    첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000)

    www.acmicpc.net

     

     

     

    풀이 )

    에라토스테네스의 체를 이용하지 않아도 풀 수 있지만, (처음에는 그렇게 풀었음)
    에라토스테네스의 체를 이용해서 푼 코드를 넣었다.

    여기서 가장 신경을 썼던것은 21번째 줄에 있는 for문과 28번째 줄이다. 

    primeNum[ i*j ] 로 한 이유는 맨처음 나오는 수는 소수이므로 true 값을 유지해야하기 때문이다.
    j= 2, 3, 5, 7 .... 이 나올 때는 true  값을 줘야 나중에 소수구별이 가능하므로 i*j 라는 수식을 넣었다.

     

     

    코드 )

    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
    import java.io.*;
    public class Main {
     
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
     
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int M = Integer.valueOf(st.nextToken());
            int N = Integer.valueOf(st.nextToken());
            
            // default값이 false이므로 다른 수들에 따로 false 값을 넣지않아도 됨
            boolean[] primeNum = new boolean[N+1];
            
            // 2부터 N까지 모든 수에 true값을 넣음
            for(int i=2; i<=N; i++)
                primeNum[i] = true;
            
            for(int i=2; i<=N; i++) { // 2부터 N까지 전부 돌면서 검사
                for(int j=2; j*i<=N; j++) { // 소수가 아닌 수를 모두 false로 바꾸는 작업
                    
                    // 이미 검사가 되어 false 값이 들어갔다면 넘어감
                    if!primeNum[i*j]) continue;
                    
                    // 아직 검사가 안된값이라면 false 값을 넣음
                    // ex). i=2, j=2 이면 i*j=4 의값이 false가 됨
                    primeNum[i*j] = false;
                }
            }
            
            for(int i=M; i<=N; i++) { // M부터 N 사이의 소수를 찾음
                if( primeNum[i] == true ) bw.write(i+"\n");
            }
        }
    } cs

    '백준코딩일기' 카테고리의 다른 글

    9020) 골드바흐의 추측  (0) 2020.01.29
    6588) 골드바흐의 추측  (0) 2020.01.29
    2960) 에라토스테네스의 체 - Java  (0) 2020.01.29
    11727) 2×n 타일링 2 - Java  (0) 2020.01.24
    11726) 2×n 타일링 - Java  (0) 2020.01.24

    댓글

Designed by Tistory.