백준

백준 브루트포스 - 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);
	}
}