문제설명

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int** arr; //2차원 배열 동적할당을 위한 더블포인터 변수
int func(int x, int y)
{
	int case1 = 0; int case2 = 0;
	for (int i = x; i < x + 8; i++)
	{
		for (int j = y; j < y + 8; j++)
		{
			if ((i + j) % 2 == arr[i][j]) ++case1;
			else if ((i + j + 1) % 2 == arr[i][j]) ++case2;
		}
	}
	return min(case1, case2);
}
int main()
{
	int N, M; int min = 1250;
	char input;
	cin >> N >> M;
	arr = new int* [N]; //각 행의 수만큼 동적할당
	for (int i = 0; i <= N; ++i) arr[i] = new int[M]; //각 열의 수만큼 동적할당
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cin >> input; //2차원 배열에 입력을 받음
			if (input == 'B') arr[i][j] = 0; //B이면 0
			else arr[i][j] = 1; //W이면 1
		}
	}
	for (int i = 0; i <= N - 8; i++) //N-8이 행에서의 최대 행동반경
	{
		for (int j = 0; j <= M - 8; j++) //M-8이 열에서의 최대 행동반경
		{
			int minCount = func(i, j);
			if (min > minCount) min = minCount; //가장 수정해야할 횟수가 적은 값을 저장
		}
	}
	cout << min;
}

 

설명