Boj 1018 체스판 다시 칠하기

Updated:

문제 링크 : 백준 https://www.acmicpc.net/problem/1018


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

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static Boolean map [][];
	static int N,M;
	static int min =64;

	public static void main(String[] args) throws IOException {

		st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		map = new Boolean[N][M];

		//전체 맵 받기

		for(int i=0;i<N;i++) {
			String in = br.readLine();
			for(int j=0;j<M;j++) {
				//W = True , B = False
				if(in.charAt(j)=='W') {
					map[i][j]=true;
				}else {
					map[i][j]=false;
				}
			}
		}

//		확인용
//		for(int i=0;i<N;i++) {
//			for(int j=0;j<M;j++) {
//				System.out.print(map[i][j]+" ");
//			}
//			System.out.println();
//		}



		// 완전탐색

		// 1~8, 2~9, ..., M-7~M 가로
		// 1~8, 2~9, ..., N-7~N 세로
		for(int i=0;i<N-7;i++) {
			for(int j=0;j<M-7;j++) {
				find(i,j);
			}
		}

		System.out.println(min);
	}

	private static void find(int x, int y) {

//		첫번째 값
		boolean flag = map[x][y];
		int count = 0;
		for(int i=x;i<x+8;i++) {
			for(int j=y;j<y+8;j++) {
				if(map[i][j]!=flag) {
					count++;
					}
				flag =(!flag);
			}
			flag=(!flag);
		}

		count = Math.min(count,64-count);


		min = Math.min(count, min);
	}

}

Leave a comment