곽로그

[백준 1987, Java] 소수찾기 본문

알고리즘/백준

[백준 1987, Java] 소수찾기

일도이동 2020. 11. 2. 14:17
반응형

문제

www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

check

1. 소수의 정의를 이용하여 3가지로 풀 수 있다.

2.  isPrimeNum3에서 두번째 for문에 n<sqrt(num)이 아닌 n*n < num 으로 한 이유는 sqrt(num)은 실수연산(근사값)이 되기 때문에 정수연산으로 바꿔주는게 좋다고 한다. (a<b -> a제곱 < b제곱) 

코드

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

public class Main {
    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;
        int primeNumberCount = 0 ;

        int N = Integer.parseInt(br.readLine().trim());
        st = new StringTokenizer(br.readLine()," ");
        for(int n = 0 ; n<N; n++){
            int num = Integer.parseInt(st.nextToken());
            if(isPrimeNum3(num)) ++primeNumberCount;
        }
        bw.write(String.valueOf(primeNumberCount));
        bw.flush();

        br.close();
        bw.close();


    }
    public static boolean isPrimeNum1(int num){
        //소수의 정의 이용 : 1과 자기 자신으로만 나누어 떨어지는 수
        // 따라서 2부터 num-1까지 수 중에서 나누어 떨어지는 경우가 있으면 소수가 아니다
        if(num == 1){
            return false;
        }
        for(int n = 2; n<num; n++){
            if(num%n ==0){
                return false;
            }
        }
        return true;
    }
    public static boolean isPrimeNum2(int num){
        //num이 소수가 아닌 경우 소인수 분해 시 2*(num/2)로 나타낼 수 있다.
        //따라서 2부터 최대 값이 N/2로
        if(num<2){
            return false;
        }
        for(int n = 2; n <= num/2 ; n++){
            if(num%n==0){
                return false;
            }
        }
        return true;
    }

    public static boolean isPrimeNum3(int num){
        //num이 소수가 아니라면 a*b(a<=b) 로 나타냈을 때 a의 최대값은 루트 num 이고 b 의 최댓값은 루트 n이다
        if(num < 2){
            return false;
        }
        for(int n = 2; n*n<=num ; n++){
            if (num%n ==0){
                return false;
            }
        }
        return true;
    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1463, Java] 1로 만들기  (0) 2020.11.04
[백준 6588, Java] 골드바흐의 추측  (0) 2020.11.02
[백준 1929, Java] 소수구하기  (0) 2020.11.02
[백준 17298, Java] 오큰수  (0) 2020.10.31
[백준 10799, Java] 쇠막대기  (0) 2020.10.28
Comments