백준/브루트포스

1018번: 체스판 다시 칠하기 [C++]

Koalitsiya 2023. 3. 27. 17:20

문제

 

 

풀이

주어진 배열을 미리 선언한 두 배열과 비교하여 다시 칠해야할 정사각형의 개수 두 가지 중 작은 값을 출력하면된다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string boardWB[8] = { "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW" };

string boardBW[8] = { "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB",
					  "BWBWBWBW",
					  "WBWBWBWB" };

vector<string> board;

pair<int, int> func(int x, int y) {
	int cntWB = 0, cntBW = 0;

	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			if (board[i + x][j + y] != boardWB[i][j])
				cntWB++;
		}
	}

	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			if (board[i + x][j + y] != boardBW[i][j])
				cntBW++;
		}
	}

	return { cntWB, cntBW };
}

int main() {
	int n, m;
	int min = 99999;
	string str;
	

	cin >> n >> m;
	
	for (int i = 0; i < n; i++) {
		cin >> str;

		board.push_back(str);
	}

	for (int i = 0; i + 8 <= n; i++) {
		for (int j = 0; j + 8 <= m; j++) {
			pair<int, int> cnt;
			int tmp = 0;

			cnt = func(i, j);

			if (cnt.first > cnt.second) tmp = cnt.second;
			else tmp = cnt.first;

			if (min > tmp) min = tmp;
		}
	}

	cout << min;

	return 0;
}