[JAVA]伯準1018-チェス盤の塗り直し


白駿1018
問題を理解する
私はN×Mの正方形に碁盤8×8を作ります.チェス盤には白黒のペンキが必要だ.N×M→8×8作成の場合、最も塗り色の少ないマス数だけでOKです.
問題を解く
  • BufferedReader,
  • を入力
  • ans(正解)を64に初期化(8 x 8なので最大塗り可能なセル数は64です.実は32ですが、まず64に初期化)
  • グリッドを移動するたびに、8 x 8を参照します.
  • でナビゲートすると、列+行は偶数W、奇数Bに固定されます.
  • の字形で着色した場合、Wの列+挙動が偶数であれば、Bの列+挙動が奇数となる.
  • 偶数面W、奇数面Bを固定して塗り直すマス数をペンキといいます.
    では、偶数B、奇数Wで塗りたいマス数を固定するのは64-partyです.
  • 最小限のペンキ価格を求めて答えを探します.
  • コード#コード#
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	public static void main(String[] args) throws IOException{
    		
    		//입력받기
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String s = br.readLine();
    		
    		StringTokenizer st = new StringTokenizer(s);
    		int N = Integer.parseInt(st.nextToken());
    		int M = Integer.parseInt(st.nextToken());
    		
    		char[][] square = new char[N][M];
    		for(int i=0;i<N;i++) {
    			square[i] = br.readLine().toCharArray();
    		}
    		
    		//정답 구하기
    		int ans = 64;
    		
    		for(int i = 0; i <= N - 8; i++) {
    			for(int j = 0; j <= M-8; j++) {
    				//해당i,j부터 8*8 탐색
    				int paint=0; //칠해야할 칸 수 -> 짝수 W, 홀수 B로 고정하고 계산 
    				for(int n=0;n<8;n++) {
    					for(int m=0;m<8;m++) {
    						if((n+m)%2==0) {
    							if(square[i+n][j+m]!='W') paint++;
    						}else {
    							if(square[i+n][j+m]!='B') paint++;
    						}
    					}
    				}
    				paint = paint<32 ? paint : 64-paint; //칠해야할 칸 수는 paint 또는 64-paint
    				ans = ans<paint ? ans : paint;
    				
    			}
    		}
    		System.out.println(ans);
    		
    		br.close();
    	}
    
    }