[풀이 방법]
먼저 8*8 체스판의 구성은 B로 시작하는 경우 , W로 시작하는 경우 두가지뿐이므로 미리 두 개의 체스판을 미리 만들어 두었다.
여기서 주어지는 입력은 88보다 크기때문에 88로 만들수 있는 모든 경우를 체크했다. 매 지점마다 미리 만들어둔 체스판이랑 비교해서 고쳐야하는 개수를 셌고 이를 리스트에 담은 다음에 최소값만 뽑았다.
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static String [][] map;
public static String [][] B;
public static String [][] W;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
int row = sc.nextInt();
int col = sc.nextInt();
sc.nextLine();
map = new String[row][col];
for(int i = 0 ; i < row; i ++) {
String str = sc.next();
for(int j = 0 ; j < col; j++) {
map[i][j] = str.substring(j,j+1);
}
}
B= new String[8][8];
W= new String[8][8];
//미리 두가지 경우의 수를 가지는 8*8짜리 체스판모양 만들어놈
for(int i = 0 ; i < 8 ; i ++) {
for(int j = 0 ; j < 8 ; j++) {
if((i%2 ==0 && j%2 ==0) || (i%2 != 0 && j%2 !=0)) {
B[i][j] = "B";
W[i][j] = "W";
}
else if((i%2 ==0 && j%2 !=0) || (i%2 !=0 && j%2 ==0)) {
B[i][j] = "W";
W[i][j] = "B";
}
}
}
int rowStart = 0;
int colStart = 0;
int cnt = 0;
//시작위치를 rowStart , colStart 지점으로하고 한 사이클돌때마다 이를 초기화해줌
while(colStart+8 <= col) {
for(int i = rowStart ; i < rowStart+8 ; i++)
for(int j = colStart ; j < colStart +8; j++)
cnt = compare(rowStart,colStart); //특정지점마다 cnt 세줌
//cnt를 모두 담고
list.add(cnt);
cnt = 0;
rowStart++;
if(rowStart+8 > row) {
rowStart = 0;
colStart++;
}
}
//최소값만 뽑기
System.out.println(Collections.min(list));
}
//rowStart,colStart 지점에서 8*8모양 map 이랑 미리 만들어둔 배열이랑 비교하고 틀린 갯수 셈
public static int compare(int row , int col) {
int value1 = 0;
int value2 = 0;
int value = 0;
if(map[row][col].equals("B")) {
for(int i = row ; i < row+8 ; i++) {
for(int j = col ; j < col+8 ; j++) {
if(!B[i-row][j-col].equals(map[i][j]))
value1++;
if(!W[i-row][j-col].equals(map[i][j]))
value2++;
}
}
}
else if(map[row][col].equals("W")) {
for(int i = row ; i < row+8 ; i++) {
for(int j = col ; j < col+8 ; j++) {
if(!W[i-row][j-col].equals(map[i][j]))
value1++;
if(!B[i-row][j-col].equals(map[i][j]))
value2++;
}
}
}
value = Math.min(value1, value2);
return value;
}
}