정의
1과 자기 자신 이외의 약수를 가지는 자연수(2 이상)입니다.
이때 √n까지만 확인해도 충분하다는 성질이 알고리즘 최적화의 핵심입니다.
수학 개념
합성수, 소수, 1의 관계
1은 소수도 합성수도 아니다
합성수는 소인수 분해가 가능하다
√n까지만 검사해도 되는 이유
알고리즘 개념
합성수 판별 2가지: √n 검사 vs 에라토스테네스의 체
1) 단일 수 판별 : 2부터 √n까지 나눠보기
2) 구간 판별: 에라토스테네스의 체(Prime Sieve)
구현
Java로 합성수 판별하기
1) 단일 수가 합성수인지 확인 (O(√n))
public class CompositeCheck {
static boolean isComposite(int n) {
if (n <= 1) return false; // 1은 합성수가 아님(정의상)
if (n == 2) return false; // 2는 소수
if (n % 2 == 0) return true; // 2보다 큰 짝수는 합성수
for (int i = 3; i * i <= n; i += 2) { // 홀수만 검사
if (n % i == 0) return true;
}
return false; // 약수가 없으면 소수
}
public static void main(String[] args) {
System.out.println(isComposite(1)); // false
System.out.println(isComposite(2)); // false
System.out.println(isComposite(9)); // true
System.out.println(isComposite(17)); // false
}
}
2) 1..N 구간에서 합성수 표시 (에라토스테네스의 체)
import java.util.*;
public class CompositeSieve {
// isComposite[i] == true -> i는 합성수
static boolean[] sieveComposite(int n) {
boolean[] isComposite = new boolean[n + 1];
if (n >= 0) isComposite[0] = true;
if (n >= 1) isComposite[1] = true;
for (int i = 2; i * i <= n; i++) {
if (!isComposite[i]) { // i가 소수라면
for (int j = i * i; j <= n; j += i) {
isComposite[j] = true; // i의 배수는 합성수
}
}
}
return isComposite;
}
public static void main(String[] args) {
int N = 30;
boolean[] comp = sieveComposite(N);
List<Integer> composites = new ArrayList<>();
for (int i = 2; i <= N; i++) {
if (comp[i]) composites.add(i);
}
System.out.println(composites); // [4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30]
}
}