Data Structure & Algorithm/백준
No2630 색종이 만들기 (분할 정복)
6cess
2022. 11. 15. 16:50
종이를 4분할 하여 1분면, 2분면, 3분면, 4분면 각각의 결과에 따라 멈추거나 다시 4분할하여 재귀 함수를 실행하는 알고리즘이다. 구현하는 방식은 어렵지 않다.
package com.yuk;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class No2630 {
static int n;
static int[][] arr;
static int one;
static int zero;
static void dq(int x, int y, int num) {
boolean flag = true;
int first = arr[x][y];
loop :
for (int i = x; i < x+num; i++) {
for (int j = y; j < y+num; j++) {
if(arr[i][j]!=first) {
flag = false;
break loop;
}
}
}
if(flag) {
if(first == 1) one++;
else zero++;
} else {
num=num/2;
dq(x, y, num);
dq(x+num, y, num);
dq(x, y+num, num);
dq(x+num, y+num, num);
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
for (int i = 0; i < n; i++) {
String[] strArr = br.readLine().split(" ");
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(strArr[j]);
}
}
dq(0,0,n);
System.out.println(zero);
System.out.println(one);
}
}