해당 문제를 처음 읽었을 때 소수를 판별하기 위한 로직을 짜야 하는 건가라고 생각했지만, 시간 복잡도 차원에서 보면 O(N)의 복잡도의 알고리즘을 사용해야 한다.
일부 필요 없는 조건을 가지치기 한 뒤, DFS로 구현하여 문제를 해결하면 된다.
ex)
- 2 + '홀수' : 소수일수도 아닐수도 있다.
- 2 + '짝수' : 약수에 2가 무조건 포함되어 소수가 아니다.
위의 로직에서 에라토스테네스 체를 사용하지 않았을 때와 사용했을 때의 시간차이는 무려 600ms나 차이난다.
import java.io.*;
import java.util.*;
public class Main{
static int N;
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
br.close();
dfs(2,1);
dfs(3,1);
dfs(5,1);
dfs(7,1);
}
static void dfs(int n, int digit){
if(N == digit){
if(isPrime(n)){
System.out.println(n);
}
return;
}
for(int i=1; i<10; i+=2){
if(isPrime(n*10+i)){
dfs(n*10+i,digit+1);
}
}
}
static boolean isPrime(int n){
for(int i=2; i <= n/2; i++){
if(n%i==0){
return false;
}
}
return true;
}
}
import java.io.*;
import java.util.*;
public class Main{
static int N;
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
br.close();
dfs(2,1);
dfs(3,1);
dfs(5,1);
dfs(7,1);
}
static void dfs(int n, int digit){
if(N == digit){
if(isPrime(n)){
System.out.println(n);
}
return;
}
for(int i=1; i<10; i+=2){
if(isPrime(n*10+i)){
dfs(n*10+i,digit+1);
}
}
}
static boolean isPrime(int n){
for(int i=2; i <= Math.sqrt(n); i++){
if(n%i==0){
return false;
}
}
return true;
}
}