본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/코테 준비

자바 백준 1929 - 소수 구하기 (에라토스테네스의 체)

by 킴뎁 2021. 10. 31.
728x90
반응형

내 풀이(시간 초과)

import java.beans.beancontext.BeanContext;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

//소수 구하기(1929)
public class Q_1929 {

    public static void main(String[] args) throws Exception  {

        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.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        for(int i=m; i<n+1; i++) {
            int cnt = 0;
            if(i == 1) {
                continue;
            } else {
                for(int j=1; j<i+1; j++) {
                    if(i%j == 0) {          //i를 j로 나눈 나머지가 0일 때
                        cnt++;              //cnt++ (i의 약수의 개수를 의미)
                    }
                }
                if(cnt == 2) {              //i의 약수의 개수가 2개일 때 i는 소수
                    bw.write(i + "\n");
                }
            }
        }
        bw.flush();
        bw.close();

    }
}

이렇게 풀면 답은 잘 출력되지만 시간 초과가 떠서 실패!

에라토스테네스의 체를 이용해서 풀어야만 시간 초과가 안 뜨고 해결이 가능하다.


정답 풀이 (에라토스테네스의 체)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

//소수 구하기(1929)
public class Q_1929 {

    public static void main(String[] args) throws Exception  {

        //에라토스테네스의 체 알고리즘 이용
        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.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        boolean[] check = new boolean[n+1]; //소수인지 아닌지 판별용 배열 선언 (0~n까지)

        check[0] = check[1] = true;         //소수 아닐 때 true, 소수일 때 false

        for(int i=2; i<=n; i++) {           //2~n까지 반복
            if(check[i] == true) {          //true이면 소수가 아님. continue;
                continue;
            }
            for(int j=i+i; j<=n; j=j+i) {   //각 소수의 배수에 true를 대입.
                check[j] = true;
            }
        }
        for(int i=m; i<=n; i++) {           //m~n까지
            if(check[i] == false) {         //check[i]가 소수일 때
                bw.write(i + "\n");     	//bw.write에 i 출력
            }
        }
        bw.flush();     //bw에 있는 데이터 flush.
        bw.close();

    }
}

 


문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다.

(1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

3 16

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

3
5
7
11
13

 

결과


이 문제는 풀지 못했다. 시간 초과 때문에 구글링을 하였고 에라토스테네스의 체 라는 것을 알게 되었다. 처음엔 잘 이해를 하지 못해서 넘어갔다가 주말에 시간 좀 남을 때 공부해서 이해한 후 다시 한 번 풀어봤다.

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글