본문 바로가기
알고리즘 문제풀이/백준

[알고리즘/백준] 1018 체스판 다시 칠하기(자바)

by jeonghaemin 2021. 9. 23.
728x90

문제

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

풀이 코드

  • 보드를 8*8로 나눌 수 있는 모든 경우의 수를 구하며 각 경우의 수마다 첫번째 칸이 검은칸부터 시작하는 경우, 흰칸부터 시작하는 경우의 다시 칠해야되는 칸의 개수를 구한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static char[][] board;

    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()); //세로
        int m = Integer.parseInt(st.nextToken()); //가로
        board = new char[n][m];
        int min = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            board[i] = s.toCharArray();
        }

        for (int i = 0; i < n - 7; i++) {
            for (int j = 0; j < m - 7; j++) {
                //첫번째 칸이 검은 칸부터 시작하는 경우
                min = Math.min(min, count(i, j, true));

                //첫번째 칸이 흰색 칸부터 시작하는 경우
                min = Math.min(min, count(i, j, false));
            }
        }

        System.out.println(min);
    }

    /**
     * @param x,y 체스판 시작 위치
     * @param startIsBlack 체스판 시작 칸이 검은색인지
     * @return 다시 칠해야되는 칸의 개수
     */
    public static int count(int x, int y, boolean startIsBlack) {
        int count = 0;
        boolean isBlack = startIsBlack;

        for (int i = x; i < x + 8; i++) {
            for (int j = y; j < y + 8; j++) {
                if (isBlack && board[i][j] == 'W') {
                    count++;
                }

                if (!isBlack && board[i][j] == 'B') {
                    count++;
                }

                isBlack = !isBlack;
            }

            isBlack = !isBlack;
        }

        return count;
    }

}

댓글