이 글에서는 함수(function)를 활용해 두 구간 사이에 존재하는 소수를 출력하는 방법을 살펴봅니다. 소수(prime number)란 약수가 오직 1과 자기 자신뿐이며, 그 외의 어떤 수로도 나누어 떨어지지 않는 특별한 수를 의미합니다.
어떤 수의 약수가 1과 자기 자신뿐이라면 그 수는 소수입니다. 예를 들어 11은 소수인데, 약수가 1과 11 자기 자신뿐이기 때문입니다. 소수의 예로는 2, 3, 5, 7, 11, 13 등이 있으며, 2는 유일한 짝수 소수이고 나머지 모든 소수는 홀수입니다.
참고: 현대 수학에서 1은 약수가 하나뿐이므로 소수로 분류하지 않습니다. 다만 이 글에서 소개하는 코드는 시작 값을 그대로 검사하기 때문에 시작 값을 1로 설정하면 1도 함께 출력됩니다. 수학적 정의에 맞게 소수만 출력하려면 시작 값을 2 이상으로 지정하는 것이 좋습니다.
입력 및 출력 예시
입력이 다음과 같다고 가정해 보겠습니다.
시작 숫자 : 1
종료 숫자 : 75
원하는 출력 결과는 다음과 같습니다.
구간 1과 75 사이의 소수는 다음과 같습니다:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
알고리즘
1단계 - 시작(START)
2단계 - my_low, my_high 두 개의 정수 변수를 선언한다.
3단계 - 사용자로부터 필요한 값을 입력받거나 값을 직접 정의한다.
4단계 - Boolean 값을 반환하는 IsPrime 함수를 정의한다. 이 함수는 정수를 입력받아, 1을 제외한 자신보다 작은 수 중 어느 하나로도 나누어 떨어지는지 검사한다.
5단계 - 나누어 떨어지는 수가 있으면 false를, 없으면 true를 반환한다.
6단계 - for 루프로 my_low부터 my_high까지 반복하면서 각 숫자마다 IsPrime 함수를 호출한다. true가 반환되면 그 숫자는 소수이므로 저장한다.
7단계 - 결과를 출력한다.
8단계 - 종료(STOP)
예제 1: 사용자로부터 값 입력받기
이 예제에서는 Scanner를 사용해 사용자가 직접 시작 숫자와 종료 숫자를 입력합니다. 온라인 코딩 도구에서 직접 실행해 확인해 볼 수도 있습니다.
import java.util.Scanner;
public class PrimeNumber {
public static void main(String[] args) {
int my_high, my_low;
System.out.println("필요한 패키지가 모두 임포트되었습니다");
Scanner my_scanner = new Scanner(System.in);
System.out.println("Scanner 객체가 생성되었습니다");
System.out.print("시작 숫자를 입력하세요 : ");
my_low = my_scanner.nextInt();
System.out.print("종료 숫자를 입력하세요 : ");
my_high = my_scanner.nextInt();
System.out.println("구간 " + my_low + "과 " + my_high + " 사이의 소수는 다음과 같습니다:");
while (my_low < my_high) {
if (IsPrime(my_low))
System.out.print(my_low + " ");
++my_low;
}
}
public static boolean IsPrime(int my_input) {
boolean flag = true;
for (int i = 2; i <= my_input / 2; ++i) {
if (my_input % i == 0) {
flag = false;
break;
}
}
return flag;
}
}
실행 결과
필요한 패키지가 모두 임포트되었습니다
Scanner 객체가 생성되었습니다
시작 숫자를 입력하세요 : 1
종료 숫자를 입력하세요 : 75
구간 1과 75 사이의 소수는 다음과 같습니다:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
예제 2: 값 미리 정의하기
이 예제에서는 시작 숫자와 종료 숫자가 코드 안에서 미리 정의되며, 정의된 값을 그대로 사용해 결과를 콘솔에 출력합니다.
public class PrimeNumber {
public static void main(String[] args) {
int my_high, my_low;
my_low = 1;
my_high = 75;
System.out.println("시작 숫자와 종료 숫자는 각각 " + my_low + "과 " + my_high + "로 정의되었습니다");
System.out.println("구간 " + my_low + "과 " + my_high + " 사이의 소수는 다음과 같습니다:");
while (my_low < my_high) {
if (IsPrime(my_low))
System.out.print(my_low + " ");
++my_low;
}
}
public static boolean IsPrime(int my_input) {
boolean flag = true;
for (int i = 2; i <= my_input / 2; ++i) {
if (my_input % i == 0) {
flag = false;
break;
}
}
return flag;
}
}
실행 결과
시작 숫자와 종료 숫자는 각각 1과 75로 정의되었습니다
구간 1과 75 사이의 소수는 다음과 같습니다:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73
마무리
이처럼 IsPrime 함수 하나만 잘 정의해 두면 원하는 구간 사이의 모든 소수를 손쉽게 찾아낼 수 있습니다. 성능을 더 높이고 싶다면 나눗셈 검사 범위를 제곱근(Math.sqrt)까지로 줄이거나, 에라토스테네스의 체 알고리즘을 활용하는 것도 좋은 방법입니다.