백준/C++

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

대니스 2022. 8. 11. 11:08

주소 : https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

소스 코드 : 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

int result = 64;
string board[50];
string wb[8] =
{
	"WBWBWBWB",
	"BWBWBWBW",
	"WBWBWBWB",
	"BWBWBWBW",
	"WBWBWBWB",
	"BWBWBWBW",
	"WBWBWBWB",
	"BWBWBWBW",
};

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

void wbcpr(int x, int y)
{
	int count = 0;
	for(int i=0;i<8;i++)
		for (int j = 0;j < 8;j++)
		{
			if (wb[i][j] != board[y + i][x + j])
				count++;
		}
	if (count < result)
		result = count;
}

void bwcpr(int x, int y)
{
	int count = 0;
	for (int i = 0;i < 8;i++)
		for (int j = 0;j < 8;j++)
		{
			if (bw[i][j] != board[y + i][x + j])
				count++;
		}
	if (count < result)
		result = count;
}

int main()
{
	int m, n = 0;
	cin >> m >> n;
	for (int i = 0;i < m;i++)
		cin >> board[i];
	for(int y=0;y<m-7;y++)
		for (int x = 0;x < n - 7;x++)
		{
			wbcpr(x, y);
			bwcpr(x, y);
		}
	cout << result;
	return 0;
}

마무리 : 체스판이 흰색, 검은색 번갈아가면서 색칠되었는지 확인하고 그렇지 않는다면 고쳐서 색칠해야한다. 흰색, 검은색이 번갈아 색칠했는지 어떻게 확인해야할지 잘 몰랐다. 처음에는 반복문 for문을 사용할가 생각했지만 그러기에는 8*8 사이즈로 어느 곳이든 허용되어야하기 때문에 다른 방법을 생각을 못 해 다른 사람들 것을 보아서 아예 흰색으로 시작한 체스판과 검은색으로 시작한 체스판을 만들어 비교를 하는 식으로 만들었다.