기본 중의 기본 문제...
이 문제가 브루트포스로 푼 다는 사실은 이미 너무 예전에 스포를 당해서 알고 있었다. 그리고 딱히 다른 접근을 하기도 힘들고, 계산을 해보면 2초 안에는 모든 연산이 끝날 것이라고 대략적으로 예상이 가능하기 때문에, 몰랐어도 아마 브루트포스롤 풀었을 것이다.
(1초에 1억번 연산이 가능하다고 할 때, 칸 수가 50칸이라고 했을 때 가능한 8x8 판의 개수 x 8x8번 비교 라고 계산하면 (43x43)x(8x8) = 약 11만이라는 결과가 나온다. 저 계산을 제외하고는 처음 입력과 비교할 8x8 판 세팅 정도에 시간이 들 텐데, 뭐 저 값에 비하면 터무니없이 작으니까.. 전혀 영향을 주지 못한다)
그래서 내 풀이의 순서는 다음과 같다.
1. 입력
2. 비교할 8x8 보드 세팅
3. 가능한 모든 8x8 크기의 보드와 세팅된 보드를 비교하면서, 최소 횟수 찾기
이렇게 해서 간단하게 답을 얻을 수가 있었다. 그나마 어려웠던 점은 가능한 8x8 보드 찾을 때 범위 설정? 원래도 이런 범위를 구하는 걸 어려워하기는 한데, 프로그래밍 언어에서 사용하는 배열은 인덱스가 0으로 시작해서 더 생각하기 어려운 것 같다.. 노력해야지
코드는 다음과 같다.
#include <iostream>
#include <vector>
using namespace std;
char chess_1[8][8];
char chess_2[8][8];
void setBoard() {
for (int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
if (i % 2 == 0) {
if (j % 2 == 0) {
chess_1[i][j] = 'W';
chess_2[i][j] = 'B';
}
else {
chess_1[i][j] = 'B';
chess_2[i][j] = 'W';
}
}
else {
if (j % 2 == 0) {
chess_1[i][j] = 'B';
chess_2[i][j] = 'W';
}
else {
chess_1[i][j] = 'W';
chess_2[i][j] = 'B';
}
}
}
}
}
int checkBoard(int x, int y, vector<vector<char>>& arr) {
int cnt_1 = 0, cnt_2 = 0;
for(int i = x; i < x+8; i++) {
for (int j = y; j < y+8; j++) {
if (arr[i][j] != chess_1[i-x][j-y]) cnt_1++;
else if (arr[i][j] != chess_2[i-x][j-y]) cnt_2++;
}
}
return min(cnt_1, cnt_2);
}
int main() {
int n, m, cnt = 65;
vector<vector<char>> arr;
cin >> n >> m;
arr.assign(n, vector<char> (m, 0));
setBoard();
for (int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
for (int i =0; i < n - 7; i++) {
for (int j = 0; j < m-7; j++) {
cnt = min(checkBoard(i, j, arr), cnt);
}
}
cout << cnt;
}