
코드를 작성하고 이해하는데 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 시작값 보냄 - 검사 - 다시 보냄