1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
๋ ๊ฐ์ง ํจ์๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํผ๋ค.
- DFS : ํ์ฌ ์๊ฐ ์์๊ฐ ๋ง๋ค๋ฉด, ์ค๋ฅธ์ชฝ์ ์๋ฆฟ์๋ฅผ ํ๋ ๋๋ ค์ ์ฌ๊ท ํ๋ค. (๋ฌธ์ ์์ ์๊ตฌํ ์๋ฆฟ์ ๊น์ง ๋ฐ๋ณต)
- ์์ ํ๋ณ: ์ฃผ์ด์ง ์๊ฐ N์ด๋ผ๋ฉด 2~ √N๊น์ง์ ์๋ก N์ ๋๋์์ ๋, ๋๋จธ์ง๊ฐ 0์ด๋ฉด false, ํ๋๋ ๋๋จธ์ง๊ฐ 0์ด ์๋๋ฉด ์์์์ผ๋ก true๋ฅผ ๋ฐํํ๋ค.
ํด๋น ํจ์๋ค์ ์ด์ฉํด, ํ์ฌ ์๋ฆฟ์๊น์ง ์์์ธ์ง ํ๋ณ ํ ๊ทธ ๋ค์ ์๋ฆฟ์๋ก ๋์ด๊ฐ๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.StringTokenizer;
public class Main {
static int n;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
dfs(0,2);
dfs(0,3);
dfs(0,5);
dfs(0,7);
System.out.println(sb);
}
public static void dfs (int depth, int previous) {
if(depth == n-1){
sb.append(previous).append("\n");
return;
}
// ์์๊ฐ ๋ง์ผ๋ฉด, ์๋ฆฟ์ ์ถ๊ฐ ํ ๋ค์ ์ฌ๊ท๋ก ๋์ด๊ฐ๋ผ
for (int i = 0; i < 10; i++) {
if (isPrime((previous*10 + i))){
dfs(depth+1, (previous*10+i));
}
}
}
// ์์ ํ๋ณ
public static boolean isPrime(int i){
for (int j = 2; j <= Math.sqrt(i); j++) {
if(i%j == 0) return false;
}
return true;
}
}
4. ์ฑ์ฅํ๊ธฐ
๋งจ ์ฒ์์๋ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ค. ๋ค์์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ ์ฝ๋์ด๋ค.
import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.StringTokenizer;
public class Main {
static int n;
static BitSet bitSet = new BitSet();
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
// ์์ ํ๋ณ - ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
int range = (int)Math.pow(10,n);
for (int i = 2; i*i < range ; i++) {
for (int j = i*i; j <= range; j += i) {
bitSet.set(j);
}
}
dfs(0,2);
dfs(0,3);
dfs(0,5);
dfs(0,7);
System.out.println(sb);
}
public static void dfs (int depth, int previous) {
if(depth == n-1){
sb.append(previous).append("\n");
return;
}
for (int i = 0; i < 10; i++) {
if (isPrime((previous*10 + i))){
dfs(depth+1, (previous*10+i));
}
}
}
public static boolean isPrime(int i){
return !bitSet.get(i);
}
}
ํด๋น ์ฝ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ ์ด์
๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ฉ๋ชจ๋ฆฌ ์ ํ์ 4MB์ด๋ค. ์๋ฌด๋ฆฌ bitset์ ์ด์ฉํด์, ํ๋์ ์ซ์ ๋น 1bit ์ฉ๋ง ์ฌ์ฉํ๋ค ํ๋๋ผ๋ ์ต๋ ์๋ฆฟ์์ธ 8์๋ฆฌ ์๋ฅผ ์ปค๋ฒํ๊ธฐ ์ํด์๋ 1์ต๊ฐ์ ๊ณต๊ฐ์ด ํ์ํ๋ค. 1bit์ฉ ์ฌ์ฉํ๋๋ผ๋ 12.5MB๊ฐ ๋ค๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
0