문제가 쉬워 보이는데 코드 만들기가 살짝 복잡하다.
브루트 포스로 푸는 게 제일 간단한데 더 나은 방법이 있는지는 모르겠다. 케이스가 많지 않아서 브루트 포스를 해도 극단적으로 많은 시간이 걸리지는 않는다.
문제 설명에서 힌트를 준 것처럼 맨 왼쪽 위의 첫번째 체스판이 W인 경우와 B인 경우 2가지 케이스로 나누어서 계산하는 것이 편하다.
처음에 2가지 케이스로 나누지 않고 단순히 앞칸과 뒷칸을 비교하기만 했는데, 케이스에 따라 결과가 달라지는 경우도 있어서 잘못된 접근법이었다.
또, 앞칸과 뒷칸을 계속 비교하는 것보다 완전한 체스판인 8x8 테이블을 만들어 그것과 비교하는 것이 직관적으로 보기에 이해도 잘 되고 쉽다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
String[][] board = new String[n][m];
String[][] WHITE =
{{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},};
String[][] BLACK =
{{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"},
{"B","W","B","W","B","W","B","W"},
{"W","B","W","B","W","B","W","B"}};
for(int i=0; i<n; i++) {
String line = br.readLine();
board[i] = line.split("");
}
int min = 64; // 가능한 큰 값으로 초기화
for(int i=0; i<n-7; i++) {
for(int j=0; j<m-7; j++) {
int Wcnt = 0, Bcnt = 0;
for(int k=i; k<i+8; k++) {
for(int l=j; l<j+8; l++) {
if(!board[k][l].equals(WHITE[k-i][l-j]))
Wcnt++;
if(!board[k][l].equals(BLACK[k-i][l-j]))
Bcnt++;
}
}
if (Wcnt < min) min = Wcnt;
if (Bcnt < min) min = Bcnt;
}
}
System.out.println(min);
}
}