※ 소수는 1과 자기 스스로만이 약수이다.
정수 N의 약수 a,b에 대해 N = ab가 성립된다.
여기서 a <= b 라 가정을 하면, 1 <= a <= √N, √N <= b <= N 이 성립된다.
정수 N이 소수가 아니라면, 2와 √N 사이에 약수가 존재한다.
import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
/**
* 주어진 숫자가 소수인지 판별하는 함수
*
* @param N
* @return true 소수라면
* @return false 소수가 아니라면
*/
public static boolean isPrime(int N){ //반환값이 논리형
if( N == 1) return false;
if( N == 2) return true;
else if(N%2 == 0) return false; //N이 2로 나눈 나머지가 0이면 == 짝수면 거짓
int count = 0; //1,N 미리 고려
for(int i = 3; i <= Math.sqrt(N); i += 2){ //math.srqt(N) = 정수 N이 어떤 정수 x의 제곱인지 판단하는 함수
// i := [2, sqrt(N)] 사이의 모든 정수
if( N % i == 0 ){ //N이 i로 나누어 떨어지면, 소수가 아님
count +=1; //count를 1 증가
break; //소수가 아님이 판별되었으니 반복문을 빠져나옴
}
}
//count := [2, sqrt(N)]의 모든 약수의 갯수
return count == 0; //count가 0이라면(범위 내에서 N의 약수가 발견되지 않은 경우) 소수(진실), 아니면 소수가 아님(거짓)
}
public static void testCase(int caseIndex)
{
int n = scanner.nextInt();
boolean result = isPrime(n);
System.out.printf("Case #%d\n", caseIndex);
if(result)
{
System.out.println("YES");
}else{
System.out.println("NO");
}
}
public static void main(String[] args) throws Exception {
int caseSize = scanner.nextInt();
for (int caseIndex = 1; caseIndex <= caseSize; caseIndex += 1) {
testCase(caseIndex);
}
}
}
10주 완성 알고리즘 코딩테스트 - goorm edu에서 들으실 수 있는 내용입니다.
'알고리즘' 카테고리의 다른 글
버블정렬 구현하기 (0) | 2023.06.15 |
---|---|
입력 받은 좌표를 토대로 쌍들 사이 최단거리와 최단거리를 갖는 쌍들의 개수 (0) | 2023.06.14 |
두 문자열 중 사전순으로 앞서는 문자열을 알아내는 함수 (0) | 2023.06.05 |
오름차순으로 정렬된 정수형 배열에서 중복을 제외한 종류의 수를 계산하는 함수 (0) | 2023.04.27 |
입력 받은 정수형 배열이 오름차순인지 검사하는 알고리즘 (0) | 2023.04.24 |