모든 숫자를 다 보는 것이 아니라, '신기한 소수'의 가능성이 있는 가계도만 따라 내려가는 것이 핵심입니다.
2, 3, 5, 7입니다. 이 네 숫자가 가계도의 뿌리가 됩니다.0~9를 붙여 새로운 수를 만듭니다.import java.util.Scanner;
public class Main {
static int N;
static final StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
// 1자리 소수(2, 3, 5, 7)부터 탐색 시작
backtrack(0, 0);
System.out.print(sb.toString());
}
static void backtrack(int cur, int k) {
// N자리에 도달하면 결과 추가
if (k == N) {
sb.append(cur).append("\n");
return;
}
for (int i = 0; i < 10; i++) {
// 자릿수 확장 (예: 2 -> 23)
int next = cur * 10 + i;
// 소수일 때만 가지를 뻗음 (가지치기)
if (isPrime(next)) {
backtrack(next, k + 1);
}
}
}
// 소수 판별 최적화: sqrt(n)까지만 확인
static boolean isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
}