[BOJ] 체스판 다시 칠하기

마코레·2022년 7월 10일
0

코테공부

목록 보기
15/19
#include<iostream>
#include<algorithm>
using namespace std;

int chess[51][51];
/*
black = 0
white = 1
*/

int check(int x,int y)
{
	int cnt1 = 0;
	int cnt2 = 0;

	for (int i = x; i < x + 8; i++) {
		for (int j = y; j < y + 8; j++) {
			if ((i + j) % 2 == chess[i][j]) cnt1++; //흰색
			if ((i + j + 1) % 2 == chess[i][j]) cnt2++; //검정색
		}
	}

	return min(cnt1, cnt2);
}

int main()
{
	int N, M;
	int mini = 2500;
	char c;

	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> c;
			if (c == 'B') chess[i][j] = 0;
			else chess[i][j] = 1;
		}
	}

	for (int i = 0; i <= N-8; i++) {
		for (int j = 0; j <= M-8; j++) {
			if (mini > check(i, j)) mini = check(i, j);
		}
	}

	cout << mini;
}

chessChange 설명

  • (row, col) 에서 시작하는 8 * 8 체스판 만드는 데 드는 최소 카운트를 리턴함.

  • B로 시작하는 체스판을 기준으로 계산한 후, W로 시작하는 체스판 만드는 바꾸는 칸 수는 64에서 앞의 카운트 빼서 계산!

  • 행 변화값 + 열 변화값이 짝수면 시작색(B)과 동일해야 함 -> 동일하지 않다면 카운트

  • 행 변화값 + 열 변화값이 홀수라면 시작색과 반대색(W) 이어야 함 -> W가 아니라면 카운트

이런식으로 작성하면 완료!

profile
새싹 백엔드 개발자

0개의 댓글