코딩 테스트

[백준] 1018번 : 체스판 다시 칠하기 - JAVA[자바]

Mong-_- 2023. 12. 3. 17:26

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 


■ 문제

 


 문제 이해

이해하기 어려운 문제는 아니다.

 

체스판의 특성상 나올 수 있는 경우의 수는 두 가지가 있다.

1. 시작 위치(맨 왼쪽 위)가 'B'로 시작되는 경우

2. 시작 위치(맨 왼쪽 위)가 'W'로 시작되는 경우

 

이때, 주의해야 하는 점은 첫 번째 칸이 'B'일 경우와 'W' 일 경우를 모두 구한 후 비교하여 최솟값을 구해야 한다.

 

바로 풀어보쟈잇


 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        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 배열은 'B', 'W' 두 가지만 입력되기 때문에 boolean 배열로 선언했다.
        boolean[][] board = new boolean[n][m];

        for (int i = 0; i < n; i++) {
            String str = br.readLine();

            for (int j = 0; j < m; j++) {
                if (str.charAt(j) == 'W') {
                    board[i][j] = true;
                    continue;
                }
            }
        }

        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, calculateBoard(board, i, j));
            }
        }

        System.out.println(min);
    }

    private static int calculateBoard(boolean[][] board, int y, int x) {
        boolean color = board[y][x];
        int count = 0;

        for (int i = y; i < y + 8; i++) {
            for (int j = x; j < x + 8; j++) {
                if (board[i][j] != color) {
                    count++;
                }

		// 색 변경
                color = !color;
            }


            /*
             * 'B'로 끝났다면 다음 줄은 또 'B'로 시작한다.
             * 위에서 color를 바꾸기 때문에 한 번더 바꿔주어서 되돌린다.
             */
            color = !color;
        }

		
        /*
         * board를 전부 바꿔야하는 최악의 경우 count = 64이다. (8 * 8이므로)
         * 하지만 시작 위치(윈쪽 맨 위)를 반대로 시작하게 된다면 바꿀게 아무것도 없으므로 count = 0이다.
         * 즉, 시작 위치를 정하고 count를 구했다면, 그 반대 시작은 64 - count가 되는 것이다.
         * 만약 64 - count를 하지 않는다면 시작 위치를 반대로 설정한 후 count 값과 비교해야 한다.
         */
        return Math.min(64 - count, count);
    }
}