문제 풀이 방법 자체는 간단하다.
입력으로 받은 보드를 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);
}
}
종이에 적으면서 차근차근 진행했다면 괜찮았을 것 같은데 바로 코드로 치려니까 포문에서 변수의 범위 설정하는게 자꾸 헷갈렸다. 바로 컴퓨터에 손을 대는 습관보다 종이에 먼저 적어보는 습관을 들여야겠다.