백준
백준 브루트포스 - 1018번 : 체스판 다시 칠하기
맴썰
2022. 2. 8. 00:14
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
int answer = 99999;
String[] chess = new String[x];
for(int i=0; i<x; i++) {
chess[i] = sc.next();
}
char[][] board = new char[x][y];
for(int i=0; i<x; i++) {
board[i] = chess[i].toCharArray();
}
char[][] target = new char[8][8];
for(int i=0; i<x-7; i++) {
for(int j=0; j<y-7; j++) {
target = copy(i,j,board);
answer = Math.min(answer, calc(target));
}
}
System.out.println(answer);
}
static char[][] copy(int x,int y, char[][] board) {
char[][] target = new char[8][8]; int xidx=0; int yidx=0;
for(int i=x; i<x+8; i++) {
yidx=0;
for(int j = y; j<y+8; j++) {
target[xidx][yidx++] = board[i][j];
}
xidx++;
}
return target;
}
static int calc(char[][] board) {
int cnt = 0;
char t = board[0][0];
char n;
if(t=='B') n = 'W';
else n = 'B';
HashMap<Integer, Character> r = new HashMap<>();
for(int i=0; i<8; i++) {
if(i%2==0) {r.put(0,t); r.put(1,n);}
else {r.put(0,n); r.put(1,t);}
for(int j=0; j<8; j++) {
if(r.get(j%2)!=board[i][j]) {
cnt++;
}
}
}
int rcnt = 0;
char rt = board[0][0];
char rn;
if(rt=='B') rn = 'W';
else rn = 'B';
for(int i=0; i<8; i++) {
if(i%2==0) {r.put(0,rn); r.put(1,rt);}
else {r.put(0,rt); r.put(1,rn);}
for(int j=0; j<8; j++) {
if(r.get(j%2)!=board[i][j]) {
rcnt++;
}
}
}
return Math.min(cnt, rcnt);
}
}