소스코드

#include <iostream>

using namespace std;

int main(){
	int A, B;
	cin >> A >> B;
	
	int alast = A-8;
	int blast = B-8; 
	
	int i, j, k, l;
	char chess[A+1][B+1];
	for (i=0; i<A; i++) {
		cin >> chess[i]; 
	}
	int min = 65;
	for (i=0; i<=alast; i++){
		for (j=0; j<=blast; j++){
			int temp1 = 0, temp2 = 0;
			int astart = i;
			int bstart = j;
			for (k=astart; k<astart+8; k++){
				for (l=bstart; l<bstart+8; l++){
					if ((k+l-astart-bstart)%2 == 0 && chess[k][l] != 'B') temp1++;
					else if ((k+l-astart-bstart)%2 == 1 && chess[k][l] == 'B') temp1++;
					else if ((k+l-astart-bstart)%2 == 0 && chess[k][l] != 'W') temp2++;
					else if ((k+l-astart-bstart)%2 == 1 && chess[k][l] == 'W') temp2++;
				}
			}
			if (temp1 < min) min = temp1;
			if (temp2 < min) min = temp2;	
		}
	}
	cout << min;
}

1. 구상

우선 시작은 나쁘지 않았다. 일단 받은 주어진 박스의 크기에서 8*8로 자를 시작점은 (좌표, index 기준) 0에서부터 (x-8)까지이다. 이 두 loop을 일단 돌려서 각 시작점이 바뀔 때마다 바뀌는 temp값을 받았다. 

그리고 다시 for loop을 두 번 돌려 각 시작점 기준 +8까지의 좌표를 완전탐색했다. (for loop을 4번 돌리는 발상을 하기가 쉽지 않았는데 (시간 초과 걸릴 줄 알았는데) 이게 맞는 거더라..)

 

k+l-(시작 좌표값) 이 짝수이면 시작점과 같은 값을, 홀수이면 시작점과 다른 값을 가져야 한다.

근데 여기서 잘못 생각한 점.. 시작점의 값은 "B" 도 될 수 있고, "W" 도 될 수 있다는 점.. 

이것을 잘못 생각해서 좀 고생했다. 

결과적으로는 구현에는 성공했다. 

 

복사했습니다!