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

[JAVA]백준 - 1018.체스판 다시 칠하기

by 겅아링 2020. 11. 11.
반응형

www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

풀이 > 

최종결과값으로 나와야하는 배열을 지정하고
입력된 판을 검사한다.
(0, 0)이 흰색또는 검은색으로 시작하는 두가지 경우를 모두 검사해줘야함!

입력된 크기가 8x8이상일 경우 기준점(시작점)을 이동시켜 검사하기
import java.io.*;

public class Baekjoon1018 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] size = br.readLine().split(" ");
        int x = Integer.parseInt(size[1]);
        int y = Integer.parseInt(size[0]);
        String[][] squareB = {
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"}};
        String[][] squareW = {
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"},
                {"W", "B", "W", "B", "W", "B", "W", "B"},
                {"B", "W", "B", "W", "B", "W", "B", "W"}};

        //입력값 넣어주기
        String[][] input = new String[y][x];
        for (int i = 0; i < y; i++) {
            String[] str = br.readLine().split("");
            for (int j = 0; j < x; j++) {
                input[i][j] = str[j];
            }
        }

        int min = 64;
        // 입력값이 8x8 초과일 경우
        // 8x8 크기로 자를수있는 기준 인덱스(시작점)로 이동해서 8x8 크기만큼 검사
        for (int z = 0; z <= ((y > 8) ? y - 8 : 0); z++) {
            for (int k = 0; k <= ((x > 8) ? x - 8 : 0); k++) {
                int countW = 0;
                int countB = 0;
                for (int i = z; i < 8 + z; i++) {
                    for (int j = k; j < 8 + k; j++) {
                        //다시 칠해야하는 갯수
                        //흰색으로 시작하는 경우
                        if (!input[i][j].equals(squareW[i - z][j - k])) countW++;

                        //검정으로 시작하는경우
                        if (!input[i][j].equals(squareB[i - z][j - k])) countB++;
                    }
                }
                // 더 작은수를 최솟값으로 저장
                min = Math.min(countW, min);
                min = Math.min(countB, min);
            }
        }
        System.out.println(min);
        br.close();
    }
}

 

반응형