π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.1780 μ’ μ΄μ κ°μ λ¬Έμ νμ΄ - java
π λ¬Έμ
https://www.acmicpc.net/problem/1780
NΓNν¬κΈ°μ νλ ¬λ‘ ννλλ μ’ μ΄κ° μλ€. μ’ μ΄μ κ° μΉΈμλ -1, 0, 1μ μΈ κ° μ€ νλκ° μ μ₯λμ΄ μλ€. μ°λ¦¬λ μ΄ νλ ¬μ μ μ ν ν¬κΈ°λ‘ μλ₯΄λ €κ³ νλλ°, μ΄λ λ€μμ κ·μΉμ λ°λΌ μλ₯΄λ €κ³ νλ€.
λ§μ½ μ’ μ΄κ° λͺ¨λ κ°μ μλ‘ λμ΄ μλ€λ©΄ μ΄ μ’ μ΄λ₯Ό κ·Έλλ‘ μ¬μ©νλ€. (1)μ΄ μλ κ²½μ°μλ μ’ μ΄λ₯Ό κ°μ ν¬κΈ°μ 9κ°μ μ’ μ΄λ‘ μλ₯΄κ³ , κ°κ°μ μλ¦° μ’ μ΄μ λν΄μ (1)μ κ³Όμ μ λ°λ³΅νλ€. μ΄μ κ°μ΄ μ’ μ΄λ₯Ό μλμ λ, -1λ‘λ§ μ±μμ§ μ’ μ΄μ κ°μ, 0μΌλ‘λ§ μ±μμ§ μ’ μ΄μ κ°μ, 1λ‘λ§ μ±μμ§ μ’ μ΄μ κ°μλ₯Ό ꡬν΄λ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
π μ κ·Όλ²
Q.1780 μ’ μ΄μ κ°μ λ¬Έμ μ λλ€.
Q.1992 μΏΌλνΈλ¦¬ λ¬Έμ μ λΉμ·ν λ¬Έμ μ λλ€.
λ¬Έμ μ μ£Όμ΄μ§ 쑰건μ μ μ΄ν΄λ³΄λ©΄ μ½κ² νμ΄κ° κ°λ₯ν©λλ€.
N * N ν¬κΈ°μ μ’ μ΄ νλ ¬μ΄ μ£Όμ΄μ§λλ€. μ΄ μ’ μ΄μ κ° μΉΈμλ -1 , 0 , 1μ μΈ κ° μ€ νλκ° μ μ₯λμ΄ μλλ°
μ΄ μ’ μ΄λ€μ μ μ ν ν¬κΈ°λ‘ μλ₯΄λ €κ³ ν©λλ€.
μ΄ λ μ’ μ΄κ° λͺ¨λ κ°μ μκ° λμ΄μμλ μ΄ μ’ μ΄λ₯Ό κ·Έλλ‘ μ¬μ©νλ €κ³ ν©λλ€.
μ’ μ΄κ° λͺ¨λ κ°μ μκ° μλλΌλ©΄ κ°μ ν¬κΈ°λ‘ 9κ°μ μ’ μ΄λ₯Ό μλ₯΄κ³ λ€μ κ°μ μλ‘ μ΄λ£¨μ΄μ Έμλμ§λ₯Ό
νμΈνκΈ°λ₯Ό λ°λ³΅νλ©΄ λ©λλ€.
λκ°μ ν¬κΈ°λ‘ κ³μ λΆν νλ©° νμΈνλ―λ‘
λΆν μ 볡 μκ³ λ¦¬μ¦μ ν΅ν΄ νμ΄κ° κ°λ₯ν©λλ€.
λ¬Έμ κ·Έλλ‘ μ’ μ΄κ° κ°μ μκ° μλλΌλ©΄ 9λ±λΆμΌλ‘ λλκ³ μ’ μ΄κ° κ°μ μμΈμ§ μλμ§ νμΈνλ κ³Όμ μ λ°λ³΅νλ©΄
λ΅μ λμΆν΄λΌ μ μμ΅λλ€.
μ΄ κ³Όμ μ λ°λ³΅νλ©° λͺ¨λ μ«μκ° 0μΈ κ²½μ°, 1μΈ κ²½μ° , -1μΈ κ²½μ°λ₯Ό λͺ¨λ ꡬνλ©΄ λ©λλ€.
π» μ½λ
package problem.divide_conquer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_1780 {
static int n;
static int paper[][];
static int minusOne = 0;
static int zero = 0;
static int plusOne = 0;
public static void main(String[] args) throws IOException {
input();
solve(0, 0, n);
System.out.println(minusOne);
System.out.println(zero);
System.out.println(plusOne);
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
paper = new int[n][n];
for (int i = 0; i < n; i++) {
String[] input = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
paper[i][j] = Integer.parseInt(input[j]);
}
}
br.close();
}
private static void solve(int startX, int startY, int len) {
if (check(startX, startY, len)) {
if (paper[startY][startX] == 1) {
plusOne++;
} else if (paper[startY][startX] == 0) {
zero++;
} else {
minusOne++;
}
} else {
int length = len / 3;
solve(startX, startY, length);
solve(startX, startY + length, length);
solve(startX, startY + (2 * length), length);
solve(startX + length, startY, length);
solve(startX + length, startY + length, length);
solve(startX + length, startY + (2 * length), length);
solve(startX + (2 * length), startY, length);
solve(startX + (2 * length), startY + length, length);
solve(startX + (2 * length), startY + (2 * length), length);
}
}
public static boolean check(int startX, int startY, int len) {
int number = paper[startY][startX];
for (int i = startY; i < startY + len; i++) {
for (int j = startX; j < startX + len; j++) {
if (number != paper[i][j]) {
return false;
}
}
}
return true;
}
}