
check함수를 따로 빼서 구현해주는 게 더 좋다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
	static int N = 0;
	static int[][] A;
	static int minus = 0;
	static int zero = 0;
	static int plus = 0;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N = Integer.parseInt(br.readLine());
		A = new int[N][N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				A[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		findPartition(0, 0, N);
		System.out.println(minus);
		System.out.println(zero);
		System.out.println(plus);
	}
	private static void findPartition(int row, int col, int size) {
		if (checkSame(row, col, size)) {
			if (A[row][col] == 1) plus++;
			else if (A[row][col] == 0) zero++;
			else if (A[row][col] == -1) minus++;
			return;
		}
		int newSize = size / 3;
		findPartition(row, col, newSize); //0.0
		findPartition(row, col + newSize, newSize); //0.3
		findPartition(row, col + 2 * newSize, newSize); //0.6
		findPartition(row + newSize, col, newSize); //3.0
		findPartition(row + 2 * newSize, col, newSize); //6.0
		findPartition(row + newSize, col + newSize, newSize); //3.3
		findPartition(row + 2 * newSize, col + 2 * newSize, newSize); //6.6
		findPartition(row + 2 * newSize, col + newSize, newSize); //6.3
		findPartition(row + newSize, col + 2 * newSize, newSize); //3.6
	}
	private static boolean checkSame(int row, int col, int size) {
		int color = A[row][col];
		for (int i = row; i < row + size; i++) {
			for (int j = col; j < col + size; j++) {
				if (color != A[i][j]) {
					return false;
				}
			}
		}
		return true;
	}
}