ALGORITHM/BOJ

[BOJ] 1018 체스판 다시 칠하기

0298 2022. 6. 19. 13:34

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

2022-06-19


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.Scanner;
 
public class Main1018 {
    public static int N, M;
    public static char[][] arr;
    public static int solve(int sx, int sy) {
       char val = arr[sx][sy];
       int count = 0;
       boolean flag = false;
       for(int i = sx; i < sx+8; i++) {
           for(int j = sy; j < sy+8; j++) {
               if(arr[i][j] != val) count++;
               val = val == 'W' ? 'B' : 'W';
           }
           val = val == 'W' ? 'B' : 'W';
       }
       return Math.min(count, (64-count));
    }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
 
        arr = new char[N][M];
        int answer = Integer.MAX_VALUE;
 
        for(int i = 0; i < N; i++) {
            String str = sc.next();
            for(int j = 0; j < M; j++) {
                arr[i][j] = str.charAt(j);
            }
        }
        for(int i = 0; i <= N-8; i++) {
            for(int j = 0; j <= M-8; j++) {
                answer = Math.min(answer, solve(i, j));
            }
        }
        System.out.println(answer);
    }
}
cs

# 문제풀이

 

체스판에서 8x8씩 떼어서 시작을 W / B로 했을 때, 다시 칠해야하는 체스판의 수를 계산하면 된다. 

 

1) 0 ~ (N-8), 0 ~ (M-8)까지 8x8이 되는 모든 경우의 수를 체크한다.

N-8, M-8을 한 이유는 길이가 8x8인 체스판이기 때문이다. 예를 들어 N이 10, M이 13면 N은 0, 1, 2까지 출발지점을 잡을 수 있고, M은 0, 1,2 ,3 ,4, 5에서 시작할 수 있다.

 

즉, (N-7)*(M-7) 만큼의 경우의 수를 계산한다. 

 

2) solve(sx, xy) 값을 넘겨서 예를 들어 B로 시작했으면 첫째줄은 BWBWBWBW, 그 다음줄은 WBWBWBWB 로 반복하면서 현재 칠해진 값이랑 비교를 했다. 다음 값을 넘어갈때마다 기준 값의 반대값 (B <-> W)으로 만들면서 비교했다. 

 

다음 줄로 아예 넘어갈 때는 시작점이 달라져서 한 번 더 반대값으로 바꾸고 비교했다. 

 

3) 처음 시작이 예를 들어 B였다면, B로 시작했을 때 칠해야하는 체스판의 수를 64(8x8)개에서 빼준 수와 B로 시작했을 때 칠해야하는 수 중 더 작은 값을 return 했다. 64 - B로 시작했을때 칠해야하는 체스판의 수는 W로 시작했을 때의 경우의 수와 같다.

 

그래서 결국엔 1)번 경우의 수에 (N-7)*(M-7) *2 를 한 경우가 최종 경우의 수가 된다.