Programing/BaekJoon

[JAVA] 백준 1018 : 체스판 다시 칠하기(완전탐색)

블스뜸 2025. 3. 29. 17:07

부르트 포트(완전탐색)를 이용한 풀이

1) main 내부에서 2중 반복문을 이용해 8*8체스판이 될 수 있는 시작점을 탐색
2) solve를 작성
3) White로 시작하는 체스판은 몇번을 칠해야 하는지 탐색 (start를 사용한 for문) = start가 0일 때
4) Black으로 시작하는 체스판은 몇번을 칠해야 하는지 탐색 (start를 사용한 for문) = start가 1일 때
5) 두 결과를 비교해서 더 낮은 값 반환
* 1로 시작점이 탐색되면 2~5반복
6) 최종적으로 가장 낮은 값을 출력

    import java.io.*;
    import java.util.StringTokenizer;

    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            char[][] board = new char[n][m];
            for (int i = 0; i < n; i++) {
                board[i] = br.readLine().toCharArray();
            }
            int min = Integer.MAX_VALUE;
            for (int i = 0; i <= n - 8; i++) {
                for (int j = 0; j <= m - 8; j++) {
                    min = Math.min(min, solve(board, i, j));
                }
            }
            bw.write(String.valueOf(min));

            bw.flush();
            bw.close();
            br.close();
        }
        public static int solve(char[][] board, int x, int y) {
            char[] colors = {'W', 'B'};
            int min = Integer.MAX_VALUE;
            // B가 시작했을 때 변경해야하는 수와 W가 시작했을 때 변경해야하는 수를 비교 하기위해
            // start를 이용해 2번 반복(Math.min(W로 시작할 경우, B로 시작할 경우)
            for (int start = 0; start < 2; start++) {
                int count = 0;
                for (int i = x; i < x + 8; i++) {
                    for (int j = y; j < y + 8; j++) {
                        if (board[i][j] != colors[(i + j + start) % 2]) {
                            count++;
                        }
                    }
                }
                min = Math.min(min, count);
            }
            return min;
        }
    }