백준 1018 자바(체스판 문제)

정호윤·2023년 3월 6일

자바

목록 보기
11/46


코드를 작성하고 이해하는데 3일정도 걸렸다.


import java.util.*;
import java.io.*;
public class Main {

    public static int defectCount(int startRow,int startCol,String[] board){
        int count = 0; // 수정한 횟수
        String[] ansBoard = {"WBWBWBWB","BWBWBWBW"}; // 정답지.무조건 저 두 패턴이 반복된다.
        for(int i=0;i<8;i++){ // 8*8 체스판을 만드니까
            int row = startRow+i; // startRow++를 해버리면 첫번째 반복에서 +1이 되버려서 결과값이 달라진다.
            for(int j=0;j<8;j++){
                int col = startCol+j;
                if(board[row].charAt(col)!=ansBoard[row%2].charAt(j)) count++; // 입력값을 정답지와 비교해서 틀리면 conut를 플러스 해준다.
            }
        }
        return Math.min(count, 64-count); // 검은색과 흰색을 비교해서 작은걸 리턴해준다.흰색 + 검은색 경우의 수는 무조건 64
    }
   
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(System.in);
        int row = sc.nextInt();
        int col = sc.nextInt();
        sc.nextLine(); // 개행문자 제거.int 이후에 줄을 띄우고 입력을 받으려면 무조건 개행문자를 제거해야 됨.

        String[] board = new String[row]; // 입력값을 저장하는 스트링 배열

        for(int i=0;i<row;i++){
            board[i] = sc.nextLine(); // 배열에 보드값을 입력받음
        }
        int sol = Integer.MAX_VALUE;
        for(int i=0;i<=row-8;i++){ // 8*8 체스판의 첫 시작적으로 이동하기 위해서 -8을 하는거임.
            for(int j=0;j<=col-8;j++){
                 int defextC = defectCount(i,j,board);
                 if(sol>defextC)  sol = defextC; // 최소값을 구하는 코드
            }
        }
        System.out.println(sol);
        sc.close();
    }
}

체스판이 w로 시작하는 경우와 b로 시작하는 경우 두개로 나뉜다.

w 칠하는 개수와 b 칠하는 개수의 합은 언제나 체스판 가로*세로와 같다.그렇기에 w,b 둘중 하나만 구하면 나머지를 구할수 있다.

코드의 구조는 이렇다.

row,col 입력 받음 - 체스판 입력 받음 - 칠해야하는 개수를 검사해주는 펑션에 보드랑 row,col 시작값 보냄 - 검사 - 다시 보냄

profile
개발자로 취직을 희망합니다.

0개의 댓글