브루트 포스. 4단계
1018번. 체스판 다시 칠하기
const fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
// 체스판의 세로(N)와 가로(M) 길이
let NM = input.shift().split(' ');
let N = Number(NM.shift());
let M = Number(NM.shift());
// 미리 만들어둔 체스판
// 왼쪽 위가 W일 경우와 B일 경우로 나눠서 만들었다
let white = ['WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW']
let black = ['BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB', 'BWBWBWBW', 'WBWBWBWB']
// 현재 보드의 상태를 넣기 위한 빈 배열
let board = [];
// N번째 줄까지 현재 체스판의 상태 board 배열에 넣어줌
// 형태는 white, black 배열과 같음
for (let i = 0; i < N; i++) {
board[i] = input.shift().split('');
}
// 전부 고쳐야할 때가 8*8 = 64개
let answer = 64;
// 8x8 영역을 선택
for (let i = 0; i <= N - 8; i++) {
for (let j = 0; j <= M - 8; j++) {
check(j, i);
}
}
// 고쳐야할지 말지 판별
function check(x, y) {
let checkWhite = 0;
let checkBlack = 0;
for (let i = y; i < y + 8; i++) {
for (let j = x; j < x + 8; j++) {
if (board[i][j] !== white[i-y][j-x])
checkWhite++;
if (board[i][j] !== black[i-y][j-x])
checkBlack++;
}
}
// B로 시작될 경우와 W로 시작될 경우 각각에 대해 고치는 횟수를 계산한 후
// 어떤 경우가 더 적은지를 판단
let min = checkBlack < checkWhite ? checkBlack : checkWhite;
// min을 계속해서 업데이트해서 더 작은 min이 되도록 해줌
if (min < answer)
answer = min;
}
console.log(answer);
열심히 고민해보다가 결국 다른 분의 풀이를 보았다.
체스판을 전부 만들어두고 시작하는 것 외에는 내 로직과 비슷해서 가져와봤다.
내 방식으로 고쳐보려고 했으나, 입력부터 오류가 발생해서 그대로 코드를 가져왔다.
주석을 달아서 개인적인 이해를 해보려고 한다.
사실 answer 변수를 만들어야하는 이유는 잘 이해하지 못했다.
전부 틀렸을 때가 64개를 고치는 상황이라서 그 것을 의미하는 줄 알았는데,
60으로 넣고 돌려고 문제가 없었다...
테스트 케이스에 포함되지 않은 상황이라 그런걸까?