본문 바로가기

알고리즘 문제

[C/C++ 백준 1018번] 체스판 다시 칠하기 (Silver 5) (Class 2)

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

범위가 크지 않기 때문에, 모든 케이스를 검사하는 브루트 포스를 이용해 해결하는 문제이다. 

처음에는 첫 글자만 받아 경우를 나누어 계산했는데, 첫글자를 색칠해 더 적어지는 경우가 존재하기 때문에 두 경우의 체스판과 비교해서 모든 cnt를 검사해야한다.

 

코드는 다음과 같다.

#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
	int N, M, cnt1, cnt2, mini=9999999;
	scanf("%d %d",&M,&N);
	char board[M][N];
	for(int i=0; i<M; i++){
		for(int j=0; j<N; j++){
			scanf(" %c",&board[i][j]);
		}
	}
	for(int i=0; i<M-7; i++){
		for(int j=0; j<N-7; j++){
			cnt1 = 0;
			cnt2 = 0;
			//가장 왼쪽위가 B일 경우 
			for(int k=i; k<i+8; k++){
				for(int q=j; q<j+8; q++){
					if((k-i+q-j)%2==0 && board[k][q]=='W')
						cnt1++;
					if((k-i+q-j)%2==1 && board[k][q]=='B')
						cnt1++;	
				}
			}
			for(int k=i; k<i+8; k++){
				for(int q=j; q<j+8; q++){
					if((k-i+q-j)%2==0 && board[k][q]=='B')
						cnt2++;
					if((k-i+q-j)%2==1 && board[k][q]=='W')
						cnt2++;		
				}
			}
			mini = min(mini, cnt1);
			mini = min(mini, cnt2);
		}
	}
	printf("%d", mini);
}