코딩테스트/백준
[Dev-Ping9] 백준 1018번 - 체스판 다시 칠하기 (Java)
DevPing9_
2021. 12. 18. 12:08


# 문제 설명
N과 M이 50보다 작으며, 시간제한은 2초라 그냥 손에 잡히는대로 풀면 풀리는 문제
# 수행시간
단순 무식하게 접근 했을 때, 8X8 의 비교연산을 (N-7)X(M-7) 번 한다. (그냥 구현만 제대로하면 된다는 뜻)
허나 N과 M의 범위가 커질때를 대비하여 더 나은 성능에 대한 고민을 해보았다.
[1X8 블록]을 만들어 옮기면서 비교하면, 추가되는 원소에 대한 비교만 해주면 되기때문에 비교연산이 1X(N-7)X(M-7) 로 줄어드나
Big-O 표기법으로 봤을 때 아무 의미 없을 것이다.
그래서 아무 걱정없이 문제가 시키는대로 구현하기로 했다.
# 코드구현
백준(맞힌사람)에서 Java 11 로 검색해서 높은순위에 공개된 코드에는 나처럼 board를 만들지 않는다...
boolean 변수 하나로 board를 대신한다... (너무 섹시한 것 같다...)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
static char[][][] board = new char[2][8][8];
static char[][] givenBoard;
static int getDifferentCount(char[][] given,int givenI, int givenJ){
int boardI=0; int boardJ=0;
int cnt_0 = 0; int cnt_1=0;
for(int i=givenI;i<8+givenI;i++){
for(int j=givenJ;j<8+givenJ;j++){
if(board[0][boardI][boardJ]!= given[i][j]){
cnt_0++;
}
if(board[1][boardI][boardJ]!= given[i][j]){
cnt_1++;
}
boardJ++;
}
boardJ=0;
boardI++;
}
return Math.min(cnt_0, cnt_1); // == Math.min(cnt_0, 64-cnt_0); wow....
}
public static void main(String[] args) throws IOException{
// 8<= m , n <=50
// 8x8 로 자름
// 칠해야되는 정사각형 최소가 되게
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
givenBoard = new char[n][m];
for(int i=0;i<n;i++){
givenBoard[i] = br.readLine().toCharArray();
}
//make target board (=> 만들필요없이 true false 로 계속 반전시키면 되는거였음 ㅠㅠ..)
int flag=0;
for(int i=0; i<8;i++){
for(int j=0; j<8;j++){
if(flag%2==0) {
board[0][i][j]='B';
board[1][i][j]='W';
}
else {
board[0][i][j]='W';
board[1][i][j]='B';
}
flag++;
}
flag++;
}
//cal min
int min=9999;
for(int i=0;i<n-8+1;i++){
for(int j=0;j<m-8+1;j++){
min= Math.min(getDifferentCount(givenBoard,i,j),min);
}
}
System.out.println(min);
}
}
728x90