코딩 테스트/JAVA - 백준 단계별로 풀어보기

[백준 Java] 브루트 포스 - 1018번: 체스판 다시 칠하기

kms152000 2025. 2. 20. 14:26

 

 

 

import java.io.*;
import java.util.Map;
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());
        int min = Integer.MAX_VALUE;

        char[][] board = new char[N][M];
        for (int i = 0; i < N; i++) {
            char[] temp = br.readLine().toCharArray(); // 행마다 배열로 바꾸기
            for (int j = 0; j < M; j++) {
                board[i][j] = temp[j];
            }
        }

        for (int i = 0; i <= N - 8; i++) { // 최소인 8칸을 확보하기 위한 시작 범위 설정
            for (int j = 0; j <= M - 8; j++) {
                int count = 0; // 판이 바뀔 때 마다 변수 초기화
                for (int k = i; k < i + 8; k++) {
                    for (int l = j; l < j + 8; l++) {
                        if ((k + l) % 2 == 1 && board[k][l] == 'W') { // 좌측 최상단을 W로 만드는 조건
                            count++;
                        } else if ((k + l) % 2 == 0 && board[k][l] == 'B') { // 좌측 최상단을 W로 만드는 조건
                            count++;
                        }
                    }
                }
                min = Math.min(min, Math.min(count, 64 - count)); // 최소를 구하려면 W와 B의 기준이 없어야 하는데 위 조건문에서 W를 기준으로 잡았기 때문에 B시작 경우도 고려하기 위해서 64(모든 경우의 수) - count
            }
        }

        bw.write(String.valueOf(min));

        br.close();
        bw.flush();
        bw.close();
    }
}