package baek_1018;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Chessboard
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N= Integer.parseInt(st.nextToken()); //y
int M = Integer.parseInt(st.nextToken()); //x
char[][] board = new char[N][M];
for(int i=0;i<N;i++)
{
String temp = br.readLine();
for(int j=0;j<M;j++)
{
board[i][j] = temp.charAt(j);
}
}
int min_count =32;
for(int i=0;i<=N-8;i++)//y축
{
for(int j=0;j<=M-8;j++)//x축
{
int temp_count=0;
//여기서부터 보드하나 검사
int ycount=0;
char dontsame = board[i][j];
int case2 =1;
while(case2<=2)
{
temp_count =0;
if(case2==1)
{
if(board[i][j]=='B')dontsame='W';
else if(board[i][j]=='W') dontsame='B';
}
else if(case2==2)
{
if(board[i][j]=='B')dontsame='B';
else if(board[i][j]=='W') dontsame='W';
}
case2++;
for(int p=i;p<i+8;p++)
{
for(int q=j;q<j+8;q++)
{
//System.out.printf("board[%d][%d]: %c\n",p,q, board[p][q]);
//System.out.printf("dontsame: %c\n", dontsame);
if(board[p][q]==dontsame)
{
temp_count++;
}
if(dontsame =='B')dontsame='W';
else if(dontsame =='W')dontsame='B';
}
if(dontsame =='B')dontsame='W';
else if(dontsame =='W')dontsame='B';
}
//System.out.println("-----------------------temp_count :" + temp_count);
if(temp_count<min_count)
{
min_count = temp_count;
//System.out.println("======================================temp_count: "+temp_count);
}
}
}
}
System.out.println(min_count);
}
}
좌우값을 입력받고 2중리스트에 W B을 채워넣는다.
보드를 자른다고 했는데 어딜 잘라야 최적인지 모르겠다. 따라서 8*8 크기로 자를수 있는 모든 경우의 수를 잘라보자
그림에 써놨듯이 잘라진 보드의 첫번째칸(board[0][0])이 'WHITE'인케이스와 'BLACK'인 케이스 모두 고려해 주어야 한다. 저걸 안했더니
이 테스트셋을 넣었을때 오류가 뜨더라. 왜냐?
위그림과 같이 이상적인 체스판은 처음과 마지막 색깔이 같다. 그런데 예제입력4 의 테스트셋을 보면 맨마지막이 'W'인걸 볼 수 있다 그러므로 처음 색깔도 W로 칠해줘야 최소의 수정횟수인 31이나온다.
행을 바꾸기전 dontsame(이것과 같으면 색칠카운트 +1)을 바꾸는 이유는
이상적인 체스판인 경우 위처럼 마지막색과 다음줄 첫번째색이 똑같다. 따라서 dontsame조건이 같아야 한다.
현재 보드의 수정횟수가 최소인지 확인