위 문제는 백준 기초 > 소수 찾기와 관련이 있다.
https://www.acmicpc.net/problem/1978
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
boolean[] isPrime = new boolean[end + 1];
for (int i = 0; i < isPrime.length; i++) {
isPrime[i] = true;
}
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= end; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= end; j += i) {
isPrime[j] = false;
}
}
}
for(int i = start; i <= end; i++) {
if(isPrime[i]) sb.append(i).append("\n");
}
System.out.println(sb);
}
}
소수 판별 알고리즘으로 유명하다.
특정한 숫자의 제곱근 까지만 약수의 여부를 검증하면 O(N^1/2) 시간 복잡도로 빠르게 판별할 수 있다고 한다.
특징
설명 아래 링크 참고
for문 i와 j를 풀어내보면 아래와 같다. (백준 예제를 기준으로 3과 16사이 범위를 기준으로 하였다.)
결과적으로 j에 해당하는 숫자들은 소수가 아니다.
처음에는 i*i를 한 다음에 계속 j = j + i를 계속한다.
미리 값의 범위만큼 boolean[]을 만들어 놓고 소수가 아닌 인덱스 주소에 false 처리를 한다.
(물론 LinkedList 등으로도 처리할 수 있다)
for문 조건도 제대로 풀어낼 수 있도록 연습이 필요해 보인다.