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

GyeongEun Kim·2021년 8월 30일
0



문제 풀이 방법

문제 풀이 방법 자체는 간단하다.

입력으로 받은 보드를 8x8만큼으로 자르고 자른 보드판을 정답 체스판과 비교해서 다르면 count를 증가시키면 된다.

위 과정을 (가로-7), (세로-7)만큼 반복하면 된다.

💥그러면 엄청난 4중 포문이 나오게 된다,,,!

이게 맞나 싶었지만 모든 경우의 수를 다 확인해야하므로(브루트 포스) 이 방법밖에 없는 것 같다.

이 때 주의해야 할 점은 체스판은 시작점 (0,0)이 검은색⚫일수도 있고, 하얀색⚪일수도 있다는 것이다.
따라서 이 두가지의 경우를 모두 고려해야한다.

검은색으로 시작하는 체스판을 b_origin이라고 하고, 하얀색으로 시작하는 체스판을 w_origin이라고 하자.
또한 b_origin과 비교했을때의 최소cnt값을 b_min이라고 하고, w_origin의 경우를 w_min이라고 하자.

8x8칸의 확인을 모두 끝낼때마다 b_min과 w_min중 더 작은 값을 고르고, 이전의 min값과 비교하여 더 작은 값을 다시 min에 저장한다.

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

public class No1018_체스판다시칠하기 {
    static char [][]b_origin = {
            {'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'},
    };

    static char [][]w_origin = {
            {'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'},
    };
    static int b_min=0;
    static int w_min=0;

    static char [][] compare;

    public static void main(String[] args) throws Exception{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String size[] = br.readLine().split(" ");
        int y = Integer.parseInt(size[0]); //세로
        int x = Integer.parseInt(size[1]); //가로

        compare =new char[y][x] ;

        for (int i=0;i<y;i++) {
            compare[i] = br.readLine().toCharArray();
           
        }//비교할 체스판 입력받음

      

        int min =Integer.MAX_VALUE;


        for (int i=0;i<=y-8;i++) {
            for (int j=0;j<=x-8;j++) {
                for (int t=0; t<8 ; t++) {
                    for (int c =0; c<8; c++) {
                        if (w_origin[t][c] != compare[t+i][c+j]) w_min++;
                        else if (b_origin[t][c] != compare[t+i][c+j]) b_min++;
                    }
                 }
                min=Integer.min(min,Integer.min(w_min,b_min));
                w_min=0;
                b_min=0;
            }
        }
        System.out.println(min);



    }

}

어려웠던 점

종이에 적으면서 차근차근 진행했다면 괜찮았을 것 같은데 바로 코드로 치려니까 포문에서 변수의 범위 설정하는게 자꾸 헷갈렸다. 바로 컴퓨터에 손을 대는 습관보다 종이에 먼저 적어보는 습관을 들여야겠다.

profile
내가 보려고 쓰는 글

0개의 댓글