μκ³ λ¦¬μ¦
[Java] BOJ 2630 μμ’ μ΄ λ§λ€κΈ°
πκ·€π
2024. 8. 5. 23:10
λ¬Έμ
λ¬Έμ λ§ν¬ https://www.acmicpc.net/problem/2630
- μλ <κ·Έλ¦Ό 1>κ³Ό κ°μ΄ μ¬λ¬κ°μ μ μ¬κ°νμΉΈλ€λ‘ μ΄λ£¨μ΄μ§ μ μ¬κ°ν λͺ¨μμ μ’ μ΄κ° μ£Όμ΄μ Έ μκ³ , κ° μ μ¬κ°νλ€μ νμμμΌλ‘ μΉ ν΄μ Έ μκ±°λ νλμμΌλ‘ μΉ ν΄μ Έ μλ€.
- μ£Όμ΄μ§ μ’
μ΄λ₯Ό μΌμ ν κ·μΉμ λ°λΌ μλΌμ λ€μν ν¬κΈ°λ₯Ό κ°μ§ μ μ¬κ°ν λͺ¨μμ νμμ λλ νλμ μμ’
μ΄λ₯Ό λ§λ€λ €κ³ νλ€.
- μ 체 μ’ μ΄μ ν¬κΈ°κ° N×N(N=2k, kλ 1 μ΄μ 7 μ΄νμ μμ°μ) μ΄λΌλ©΄ μ’ μ΄λ₯Ό μλ₯΄λ κ·μΉμ λ€μκ³Ό κ°λ€.
- μμ κ°μ κ·μΉμ λ°λΌ μλμ λ <κ·Έλ¦Ό 3>μ <κ·Έλ¦Ό 1>μ μ’ μ΄λ₯Ό μ²μ λλ νμ μνλ₯Ό, <κ·Έλ¦Ό 4>λ λ λ²μ§Έ λλ νμ μνλ₯Ό, <κ·Έλ¦Ό 5>λ μ΅μ’ μ μΌλ‘ λ§λ€μ΄μ§ λ€μν ν¬κΈ°μ 9μ₯μ νμμ μμ’ μ΄μ 7μ₯μ νλμ μμ’ μ΄λ₯Ό 보μ¬μ£Όκ³ μλ€.
- μ 체 μ’ μ΄κ° λͺ¨λ κ°μ μμΌλ‘ μΉ ν΄μ Έ μμ§ μμΌλ©΄ κ°λ‘μ μΈλ‘λ‘ μ€κ° λΆλΆμ μλΌμ <κ·Έλ¦Ό 2>μ I, II, III, IVμ κ°μ΄ λκ°μ ν¬κΈ°μ λ€ κ°μ N/2 × N/2μμ’ μ΄λ‘ λλλ€.
- λλμ΄μ§ μ’ μ΄ I, II, III, IV κ°κ°μ λν΄μλ μμμμ λ§μ°¬κ°μ§λ‘ λͺ¨λ κ°μ μμΌλ‘ μΉ ν΄μ Έ μμ§ μμΌλ©΄ κ°μ λ°©λ²μΌλ‘ λκ°μ ν¬κΈ°μ λ€ κ°μ μμ’ μ΄λ‘ λλλ€.
- μ΄μ κ°μ κ³Όμ μ μλΌμ§ μ’
μ΄κ° λͺ¨λ νμμ λλ λͺ¨λ νλμμΌλ‘ μΉ ν΄μ Έ μκ±°λ, νλμ μ μ¬κ°ν μΉΈμ΄ λμ΄ λ μ΄μ μλ₯Ό μ μμ λκΉμ§ λ°λ³΅νλ€.
- μ λ ₯μΌλ‘ μ£Όμ΄μ§ μ’ μ΄μ ν λ³μ κΈΈμ΄ Nκ³Ό κ° μ μ¬κ°νμΉΈμ μ(νμμ λλ νλμ)μ΄ μ£Όμ΄μ§ λ μλΌμ§ νμμ μμ’ μ΄μ νλμ μμ’ μ΄μ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
- 첫째 μ€μλ μ 체 μ’ μ΄μ ν λ³μ κΈΈμ΄ Nμ΄ μ£Όμ΄μ Έ μλ€. Nμ 2, 4, 8, 16, 32, 64, 128 μ€ νλμ΄λ€.
- μμ’ μ΄μ κ° κ°λ‘μ€μ μ μ¬κ°νμΉΈλ€μ μμ΄ μμ€λΆν° μ°¨λ‘λ‘ λμ§Έ μ€λΆν° λ§μ§λ§ μ€κΉμ§ μ£Όμ΄μ§λ€.
- νμμμΌλ‘ μΉ ν΄μ§ μΉΈμ 0, νλμμΌλ‘ μΉ ν΄μ§ μΉΈμ 1λ‘ μ£Όμ΄μ§λ©°, κ° μ«μ μ¬μ΄μλ λΉμΉΈμ΄ νλμ© μλ€.
- 첫째 μ€μλ μλΌμ§ νμμ μμ’ μ΄μ κ°μλ₯Ό μΆλ ₯νκ³ , λμ§Έ μ€μλ νλμ μμ’ μ΄μ κ°μλ₯Ό μΆλ ₯νλ€.
μμ΄λμ΄
- μ΄κ³Ό νμ μμμ λΆν° λμ κΉμ§ μ¬μ΄μ¦λ§νΌ λμμ λ, μμμ κ³Ό ν΄λΉ μ§μ μ κ°μ΄ κ°μ§ μλ€λ©΄ ν΄λΉ μμΉμ ν΄λΉ μ¬μ΄μ¦ μ μ¬κ°νμΌλ‘ μμ’ μ΄λ₯Ό λ§λ€ μ μλ€λ λ»μ΄λ€.
- λ°λΌμ μ΄μ μμμ κ³Ό νμ μμμ μ ν¨μ κΈ°μ€μΌλ‘ 1μ¬λΆλ©΄, 2μ¬λΆλ©΄, 3μ¬λΆλ©΄, 4μ¬λΆλ©΄ μμμ κΈ°μ€μΌλ‘ λλκ³ μλ μ¬μ΄μ¦λ₯Ό 2λΆμ 1λΈ ν¬κΈ°λ₯Ό λ°νμΌλ‘ DFSλ₯Ό λλ¦°λ€.
- λ§μ½ ν΄λΉ ν¬κΈ°λ‘ μμ’ μ΄λ₯Ό λ§λ€ μ μλ€λ©΄ 첫 μμ μ§μ μ κ°μ νλ¨ν΄μ νλμμΈμ§ ν°μμΈμ§ ꡬλΆνμ¬ μΉ΄μ΄νΈ νκ³ returnνλ€.
κ²ͺμ μνμ°©μ€
- νΈλλ° μκΎΈ stackoverflowκ° λμ λκ° λ¬Έμ μ§ κ³μ κ³ λ―Όνλ κ² κ°λ€.
- DFSλ₯Ό λ릴 λ κΈ°μ 쑰건μ λͺ νν μ€μ ν΄μ£Όμ§ μμ 무ν DFS νμμ΄ λ°μνμ¬ stackoverflowκ° λ¬λ κ²μ΄μλ€.
- μμΌλ‘ κΈ°μ 쑰건μ μ’ λ κΌΌκΌΌν μ€μ νμ¬μΌκ² λ€...
μ½λ
import java.io.*;
import java.util.*;
public class BOJ2630 {
static int N;
static int paper[][];
static int b_cnt;
static int w_cnt;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ν λ³μ κΈΈμ΄
N = Integer.parseInt(br.readLine());
// μμ’
μ΄κ° μΉ ν΄μ§ λͺ¨μ
paper = new int[N][N];
// νλμ μ’
μ΄ μΉ΄μ΄νΈ
b_cnt = 0;
// νμμ μ’
μ΄ μΉ΄μ΄νΈ
w_cnt = 0;
for(int i = 0; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++){
int n = Integer.parseInt(st.nextToken());
// μ’
μ΄μ κ°μ μ μ₯νλ λ°°μ΄ μ μ’
μ΄μ μ μ₯
paper[i][j] = n;
}
}
DFS(0, 0, N);
System.out.println(w_cnt);
System.out.println(b_cnt);
}
static public void DFS(int l, int k, int S){
// μ μ¬κ°νμΌλ‘ μλ₯Ό μ μλμ§ μ¬λΆ νλ¨ λ³μ
boolean TF = true;
for(int i = l; i < l + S; i++){
for(int j = k; j < k + S; j++){
// λ§μ½ μ’
μ΄μ μμλΆλΆκ³Ό ν΄λΉ λΆλΆμ κ°μ΄ κ°μ§ μλ€λ©΄
if(paper[i][j] != paper[l][k]){
// ν΄λΉ ν¬κΈ°μ μ μ¬κ°νμ ν°μ, νλμμΌλ‘ λλμ§ μλλ€λ
// λ»μ΄λ―λ‘ falseλ‘ λ°κΎΈκ³ λ°λ³΅λ¬Έ μ’
λ£
TF = false;
break;
}
}
if(!TF){
break;
}
}
// λ§μ½ ν΄λΉ ν¬κΈ°μ μ μ¬κ°νμ ν μκΉλ‘ μΉ ν μ μλ€λ©΄
// ν΄λΉ μ μ¬κ°νμ μμλΆλΆμ μ«μλ₯Ό νμΈ ν,
// ν°μμ΄λ νλμ μΉ΄μ΄νΈ + 1
if(TF){
// μ«μκ° 1μ΄λΌλ©΄ νλμ + 1
if(paper[l][k] == 1){
b_cnt = b_cnt + 1;
}
// μ«μκ° 0μ΄λΌλ©΄ ν°μ + 1
else if(paper[l][k] == 0){
w_cnt = w_cnt + 1;
}
}
// ν΄λΉ ν¬κΈ°μ μ μ¬κ°νμΌλ‘ μλ₯Ό μ μλ€λ©΄ 2λΆμ 1κΈΈμ΄λ‘ μλΌμ
// λ€μ DFSλ₯Ό λλ¦Ό
else if(!TF){
int newS = S / 2;
// 2μ¬λΆλ©΄
DFS(l, k, newS);
// 1μ¬λΆλ©΄
DFS(l, k + newS, newS);
// 3μ¬λΆλ©΄
DFS(l + newS, k, newS);
// 4μ¬λΆλ©΄
DFS(l + newS, k + newS, newS);
}
}
}