π κ·Έλνλ₯Ό νμνλ λ°©λ²μλ ν¬κ² κΉμ΄ μ°μ νμ(DFS)μ λλΉ μ°μ νμ(BFS)κ° μλ€.
μ¬κ· ν¨μλ‘ κ΅¬ννκ±°λ μ€νμ μ΄μ©ν¨ !! β μκ°λ³΅μ‘λλ O(V+E) // V: λ Έλ μ, E: μμ§ μ
- κ·Έλν μμ νμ κΈ°λ² μ€ νλλ‘, κ·Έλνμ μμ λ Έλμμ μΆλ°νμ¬ νμν ν μͺ½ λΆκΈ°λ₯Ό μ νμ¬
μ΅λ κΉμ΄κΉμ§
νμμ λ§μΉ ν λ€λ₯Έ μͺ½ λΆκΈ°λ‘ μ΄λνμ¬ λ€μ νμμ μνν¨- μ¬κ·λ‘ ꡬνν κ²½μ° μ€ν μ€λ²νλ‘μ°μ μ μν΄μΌ νλ€.
- DFS νμ© μλ‘λ λ¨μ μ μ°ΎκΈ°, λ¨μ μ μ°ΎκΈ°, μ¬μ΄ν΄ μ°ΎκΈ°, μμμ λ ¬ λ±μ΄ μλ€.
πν λ² λ°©λ¬Έν λ
Έλ μ¬λ°©λ¬Έ λΆκ° β λ°©λ¬Έ μ²΄ν¬ λ°°μ΄ νμ
πμ΅λν κΉμ΄ λ΄λ €κ° λ€, λμ΄μ κ° κ³³μ΄ μλ κ²½μ° μμΌλ‘ μ΄λν¨
π‘ κ²°λ‘
π©π»βπ» κ΄λ ¨λ¬Έν (λ°±μ€ 2023λ² μ κΈ°ν μμ μ°ΎκΈ°)
맀컀λμ¦
dfsλ λ°±νΈλνΉμΌλ‘ ꡬν κ°λ₯
import java.io.*;
import java.util.*;
public class BJ2023 {
static String [] nextNum = {"1", "3", "7", "9"};
// 2μλ°°μ, 5μ λ°°μλ μμκ° λ μ μμ
static StringBuilder sb= new StringBuilder();
static int N;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String [] alwaysPrime = {"2", "3", "5","7"};
N = Integer.parseInt(br.readLine());
for(int i = 0; i<4; i++) {
makePrime(alwaysPrime[i], 1);
}
System.out.println(sb.toString());
}
static void makePrime(String s, int cnt) {
if(cnt == N) {
sb.append(s+"\n");
return;
}
for(int i = 0; i<4; i++) {
if(isPrime(s+nextNum[i]))
makePrime(s+nextNum[i], cnt+1);
}
}
static boolean isPrime(String s) {
int tmp = Integer.parseInt(s);
for(int i = 2; i<Math.sqrt(tmp); i++) {
if(tmp % i == 0) return false;
}
return true;
}
}
νλ₯Ό μ΄μ©ν΄μ ꡬνν¨! β μκ°λ³΅μ‘λλ O(V+E) // V: λ Έλ μ, E: μμ§ μ
- κ·Έλν μμ νμ λ°©λ² μ€ νλλ‘, μμ λ Έλμμ μΆλ°ν΄ μμ λ Έλλ₯Ό κΈ°μ€μΌλ‘ κ°κΉμ΄ λ Έλλ₯Ό λ¨Όμ λ°©λ¬Ένλ©΄μ νμνλ μκ³ λ¦¬μ¦
- FIFO λ°©μμ΄κΈ° λλ¬Έμ νλ‘ κ΅¬νν¨
πν λ² λ°©λ¬Έν λ
Έλ μ¬λ°©λ¬Έ λΆκ° β λ°©λ¬Έ μ²΄ν¬ λ°°μ΄ νμ
πνλ₯Ό μ΄μ©ν FIFO λ°©μ !
π‘ κ²°λ‘
π©π»βπ» κ΄λ ¨λ¬Έν (λ°±μ€ 2468 μμ μμ)
package homework;
import java.io.*;
import java.util.*;
/*
5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7
*/
public class Main_bj_2468 {
static int N;
static int[][] map;
static boolean[][] checked;
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0,- 1, 0, 1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb= new StringBuilder();
N= Integer.parseInt(br.readLine());
map = new int[N][N];
int maxH=0;
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] > maxH) {
maxH =map[i][j];
}
}
}
int max =0;
for(int h=0; h<maxH; h++) {
checked = new boolean[N][N];
int cnt=0;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(!checked[i][j] && map[i][j] > h){
//cnt+=dfs(i,j,h);
cnt+=bfs(i,j,h);
}
}
}
max = Math.max(max, cnt);
}
System.out.println(max);
}
// DFSνμ
static int dfs(int x, int y, int h) {
checked[x][y] = true;
for(int i=0; i<4; i++) {
int nx = x +dx[i];
int ny = y +dy[i];
if(nx >=0 && nx<N && ny>=0 && ny<N && map[nx][ny] > h && !checked[nx][ny]) {
dfs(nx, ny, h);
}
}
return 1;
}
// BFSνμ
static int bfs(int x, int y, int h) {
Queue<int[]> q = new ArrayDeque<int[]>();
checked[x][y] = true;
q.offer(new int[] {x, y});
while(!q.isEmpty()) {
int [] pos =q.poll();
x = pos[0];
y = pos[1];
for(int d =0; d<4; d++) {
int nx = x+dx[d];
int ny = y+dy[d];
if(nx >=0 && nx<N && ny>=0 && ny<N && map[nx][ny] > h && !checked[nx][ny]) {
checked[nx][ny] = true; // μ€λ³΅λ μ μμΌλκΉ μ¬κΈ°μ check!
q.offer(new int[] {nx, ny});
}
}
}
return 1;
}
}
π DFS? BFS?