1 λΆ„ μ†Œμš”

πŸ“ [S2_1780] μ’…μ΄μ˜ 개수

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {
	static StringTokenizer st;
	static int[][] arr;
	static int[] color;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// ν–‰λ ¬μ˜ 크기 
		int N = Integer.parseInt(br.readLine());
		
		arr = new int[N][N];
		
		// -1, 0, 1 
		color = new int[3]; 
		
		// λ°°μ—΄ μž…λ ₯
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0; j<N; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		partition(0,0,N);
		
		
		for(int i=0; i<3; i++) {
			System.out.println(color[i]);
		}
	}
	
	
	static void partition(int row, int col, int size) {
		// 쒅이가 λ‹€ 같은 색이면
		if(check(row, col, size)) {
		
			if(arr[row][col] == -1) {
				color[0]++;
			}
			else if(arr[row][col] == 0) {
				color[1]++;
			}
			else {
				color[2]++;
			}
			return;
		}
		
		// λ‹€ λ‹€λ₯Έμƒ‰μ΄λ©΄ 9 λ“±λΆ„
		
		int newSize = size/3;
		
		// 맨 μœ—μ€„
		partition(row,col,newSize);
		partition(row,col + newSize ,newSize);
		partition(row,col + 2*newSize,newSize);
		
		// 쀑간 쀄
		partition(row + newSize,col,newSize);
		partition(row + newSize,col + newSize ,newSize);
		partition(row + newSize,col + 2*newSize,newSize);
		
		// 맨 밑쀄
		partition(row + 2*newSize,col,newSize);
		partition(row + 2*newSize,col + newSize ,newSize);
		partition(row + 2*newSize,col + 2*newSize,newSize);
	}
	
	
	// 쒅이가 λ‹€ 같은 값인지 μ•„λ‹Œμ§€ 
	static boolean check(int row, int col, int size) {
		int first = arr[row][col];
		for(int i=row; i<row+size; i++) {
			for(int j=col; j<col+size; j++) {
				if(first != arr[i][j]) {
					return false;
				}
			}
		}
		return true;
	}
}

πŸ€” λ‚˜μ˜ 생각

9등뢄을 ν•˜μ—¬ 계속 κ΅¬ν•΄λ‚΄λŠ” 것을 보고 μž¬κ·€κ°€ λ– μ˜¬λžλ‹€.
κ·Έλž˜μ„œ μ’…μ΄μ•ˆμ— μˆ«μžκ°€ λ‹€ 같은 색인지 μ•Œμ•„λ‚΄λŠ” λ©”μ„œλ“œ ν•˜λ‚˜ , 전체λ₯Ό λŒλ©΄μ„œ 같은 색이면 각 숫자의 개수λ₯Ό μΉ΄μš΄νŒ… ν•΄μ£Όκ³  λ‹€λ₯Έ 색이면 9λ“±λΆ„ν•˜μ—¬ μž¬κ·€λ₯Ό λŒλ Έλ‹€.
이런 λ¬Έμ œλŠ” 뢄할을 잘 μ΄μš©ν•΄μ•Ό ν•˜λŠ” 것 κ°™λ‹€. μž¬κ·€λ₯Ό 돌리면 보톡 ν•˜λ‚˜μ˜ μž¬κ·€ 호좜문으둜 μƒκ°ν•˜λŠ”λ° λΆ„ν•  λ¬Έμ œλŠ” λΆ„ν• ν•˜λŠ” 개수만큼 μž¬κ·€ ν˜ΈμΆœλ¬Έμ„ μ‚¬μš©ν•΄μ•Όν•΄μ„œ μ•Œκ³  μžˆμ§€ μ•ŠμœΌλ©΄ 생각해내기 μ–΄λ €μš΄ 것 κ°™λ‹€.
그리고 μž¬κ·€ ν˜ΈμΆœν•  λ•Œ μƒˆλ‘œμš΄ μ‚¬μ΄μ¦ˆλ₯Ό N이 3의 λ°°μˆ˜λ‹ˆκΉŒ 3을 λ‚˜λˆ μ£ΌλŠ” 것도 μ€‘μš”ν•˜λ‹€.
싀버2 μ˜€μ§€λ§Œ 뢄할에 λŒ€ν•΄ λ―Έμˆ™ν•˜μ—¬ μ‹œκ°„μ΄ μ’€ κ±Έλ Έλ‹€..
그리고 제일 μ²˜μŒμ—λŠ” 9뢄할을 λͺ»λ³΄κ³  달라지면 λΆ„ν• ν•΄μ•Όλ˜λŠ” 것을 μƒκ°ν•˜λ‹€ λ„ˆλ¬΄ μ–΄λ €μš΄λ° ν•˜κ³  λ³΄λ‹ˆ 9λΆ„ν•  μ΄μ˜€λ”°.. γ…‹γ…‹
μ’€ 더 집쀑 ν•˜μž !!