# 체스판 다시 칠하기(1018)

## 문제

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M\_N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8\_8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8\_8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8\_8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

## 입력

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

## 출력

첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

## 예제 입력

```
8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
```

## 예제 출력

```
1
```

## 예제 입력2

```
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
```

## 예제 출력2

```
12
```

아 왜틀리냐고 실행해보면 다 맞는거같은데 -> 최소갯수?

boolean으로 해서는 방법이 없는걸까? -> int으로 변환해서 사용

문제의 이해가 덜 됬었던거같다 => 8x8으로 잘라서 확인하는데, 여기서 확인하는 체스판(B시작, W시작)인지 정하는게 아니라 둘 다 확인하고 그 중에서 최소값을 제출하는 방식인것!!!!

+if문을 그지같이 짰었음(i 범위를 따로 재고, j 범위를 따로 쟀었는데) 친구의 도움으로 걍 더해서 확인하는 것이 코드의 양/가독성 모두 한꺼번에 처리해준다는 것을 알려줌 ㅠㅠ 감사합니다

## 풀이

```java
import java.util.*;
public class Test{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        //8x8 기준으로 다 바꿀때(최대값)은 64
        int count=0, min = 64;

        String arr[][] = new String[N][M];

        for(int i=0; i<N; i++){
            String[] tmp = sc.next().split("");
            for(int j=0; j<M; j++){
                arr[i][j] = tmp[j];
            }
        }

        for(int i=0; i<N-7; i++){
            for(int j=0; j<M-7; j++){
                count = cc(arr, i, j);
                if(min > count){
                    min = count;
                }

            }
        }
        System.out.println(min);
    }

    public static int cc(String arr[][], int x, int y){
        int c1 = 0;
        int c2 = 0;
            //18번도는거 확인
            //System.out.println("Starts With B");
            for(int i=x; i<x+8; i++){
                for(int j=y; j<y+8; j++){
                    if((i+j)%2==0) {
                        //이거 더해서.... 좋은꿀팁
                        //제대로된 판을 그려보면 arr[i][j]에 B가 있어야함
                        //근데 B가 아니라 W가 있다면 바꿔줘야하니까 ++
                        if (arr[i][j].equals("W") == true){
                            //System.out.println(arr[i][j]+" is W");
                            c1++;
                        }
                    }
                    else if((i+j)%2==1) {
                        //여기에는 arr[i][j]에 W가 있어야하지만
                        //B가 있다면 바꿔줘야하니까 ++
                        if (arr[i][j].equals("B") == true){
                            //System.out.println(arr[i][j]+" is B");
                            c1++;
                        }
                    }
                }
            }
            for(int i=x; i<x+8; i++){
                for(int j=y; j<y+8; j++){
                    if((i+j)%2==0) {
                        if (arr[i][j].equals("B") == true)
                            c2++;

                    }
                    else if((i+j)%2==1) {
                        if (arr[i][j].equals("W") == true)
                            c2++;
                    }
                }
            }

            if(c1 > c2)
                return c2;
            else
                return c1;
    }


}
```

[백준](https://www.acmicpc.net/problem/1018)
