간단하지만 생각보다 헤매느라 시간을 잡아먹은 문제...
특히 자바는 익숙하지 않아서 scanner를 사용하지않고 받는 부분에서 약간 헷갈렸다.
요약하자면,
B로 시작하는 88체스판과 W로 시작하는 88체스판 두 개의 배열을 준비함.
첫 시작 좌표를 (i , j)로 잡는다.
시작좌표 (i , j)로부터 8*8만큼 체스판을 떼어내서 1)의 배열과 비교해서 바뀌는 부분의 개수를 센다.
위 과정을 좌표를 한칸씩 이동하면서 전부 비교함(브루트 포스 알고리즘)
가장 작은 값을 출력함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
char Wstart[][]= {{'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'}};
char Bstart[][]= {{'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'}};
int TestChess(int i,int j,char[][] chess) {
int changeB=0,changeW=0;
char test[][];
test = Bstart.clone();
for(int x=i;x<i+8; x++){
for(int y=j; y<j+8; y++) {
if(chess[x][y]!=test[x-i][y-j])
changeB++;
}
}
test = Wstart.clone();
for(int x=i;x<i+8; x++){
for(int y=j; y<j+8; y++) {
if(chess[x][y]!=test[x-i][y-j])
changeW++;
}
}
return Math.min(changeW, changeB);
}
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine()," ");
Main Main = new Main();
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
char[][] chess = new char[N][M];
for(int i=0; i<N; i++)
chess[i]=br.readLine().toCharArray();
int min=2500;//최대값으로 설정 50*50
int result;
for(int i=0; i<=N-8; i++) {
for(int j=0; j<=M-8; j++) {
result=Main.TestChess(i, j, chess);
if(min>result)
min=result;
}
}
System.out.println(min);
}
}
내가 간과했던 부분으로 인해 시간을 잡아먹었다
초기 min값은 가장 큰 값으로 설정해야함(이 당연한걸...ㅠ)
시작 좌표 (i , j)는 0~N-8 과 0~M-8 까지 설정해야함
비교는 B로 시작하는 경우와 W로 시작하는 경우 둘다 해야함.(첫 시작 문자는 고정이라고 착각하면 안됨)
이 부분을 꼭 참고했으면 한다.
하.. 코딩 오랜만에 하려니깐 힘드네