const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
const [N, M] = input.shift().split(' ').map(x => +x);
arr = input.map(x => x.trim().split(''));
const line = ['WBWBWBWB', 'BWBWBWBW'];
const answer = [];
for(let i=0; i <= M-8; i++) {
for(let j=0; j <= N-8; j++) {
for(let n=0; n < 2; n++) {
let count = 0;
for(let x=0; x < 8; x++) {
for(let y=0; y < 8; y++) {
const crurr = arr[j+y][i+x];
if(crurr !== line[(n+x) % 2][y]) {
count++;
}
}
}
answer.push(count);
}
}
}
console.log(Math.min.apply(null, answer));
단순하게 생각했으면 됐다. 8X8 정사각형을 돌릴 이중for문, 그것을 감싸는 8X8정사각형을 자를 이중for문을 작성한다. 그리고 정사각형을 비교할 때, B로 시작하는 것과 W로 시작하는 것 두개 모두 확인하기 위해 for문을 또 돌려준다.
arr[(n+x) % 2][y]의 의미는 n=0일때 즉, W가 먼저 시작하는 것과 비교할 때 n=0 / x=0 => 짝수면 w , n=0 / x=1 => 홀수면 B, 이렇게 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW' 순으로 갔다가 n=1이되면 거꾸로 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB' 순으로 이루어진 정사각형을 비교할 수 있다. 이렇게 찾은 count에서 가장 작은 수를 출력하면된다.