코딩테스트/알고리즘

6. 소수 판별

초코chip 2024. 4. 2. 20:19

개념

  • 정의: 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로 나누어떨어지지 않는 자연수

 

구현 방법

  • 모든 약수가 가운데 약수(제곱근)를 기준으로 곱셈 연산에 대해 대칭을 이룸
    • 따라서, 특정 자연수의 약수를 찾을 때, 가운데 약수까지만 확인하면 됨

 

코드

public class Main {
    public static boolean isPrimeNum(int x){
        //2부터 x의 제곱근까지만 모든 수를 확인
        for(int i=2; i<=Math.sqrt(x); i++){
            if(x % i == 0){
                return false;
            }
        }
        return true;
    }
    
    public static void main(String[] args){
        System.out.println(isPrimeNum(7));
    }
}

 

 

다수의 소수 판별

에라토스테네스의 체 알고리즘

  • 정의: 특정수의 범위에 존재하는 모든 소수를 찾는 방법
  • 시간복잡도: O(Nlog<logN>)
    • 거의 선형에 가까울 정도로 빠름
    • but, 범위에 해당하는 정도의 메모리 공간이 필요 
  • 동작 과정
    1. 2부터 N까지의 모든 자연수 나열
    2. 2부터 n의 제곱근 까지의 아래 과정 반복
      • 남은 수 중 i의 배수를 모두 제거(i는 제거x)

 

 

코드

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        //1. 2~n까지의 자연수 준비
        int n = sc.nextInt();
        boolean[] arr = new boolean[n+1];
        Arrays.fill(arr, true);

        //2. 2~n의 제곱근까지 아래 과정 반복
        for(int i=2; i<=Math.sqrt(n); i++){
            if(arr[i] == true){
                for(int j=2; i*j <=n; j++){ //남은 수 중 i의 배수 모두 제거
                    arr[i*j] = false;
                }
            }
        }

        //3. 결과 출력
        StringBuilder sb = new StringBuilder();
        for(int i=2; i<=n; i++){
            if(arr[i]){
                sb.append(i + " ");
            }
        }
        System.out.println(sb);
    }
}

'코딩테스트 > 알고리즘' 카테고리의 다른 글

7-2. 슬라이딩 윈도우  (0) 2024.04.02
7. 투 포인터  (0) 2024.04.02
5. 다이나믹 프로그래밍(동적 계획법)  (0) 2024.02.26
4. 탐색 알고리즘(순차, 이진 탐색)  (0) 2024.02.22
3. 정렬 알고리즘  (0) 2024.02.20