白準1018チェス盤(JAVA)を塗り直す

2964 ワード



[解法]
まず、8*8チェス盤はBで始まり、Wで始まり、2種類しかないので、事前にチェス盤を2つ作っておきました.
ここで与えられた入力は88より大きいので、88になることができるすべての状況をチェックしました.各地点はあらかじめ作成したチェス盤と比較し,修正すべき数を数え,リストに列挙し,最小値のみ抽出する.
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	public static String [][] map;
	public static String [][] B;
	public static String [][] W;
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> list = new ArrayList<>();

		int row = sc.nextInt();
		int col = sc.nextInt();
		sc.nextLine();

		map = new String[row][col];
		for(int i = 0 ; i < row; i ++) {
			String str = sc.next();
			for(int j = 0 ; j < col; j++) {
				map[i][j] = str.substring(j,j+1);
			}
		}


		B= new String[8][8];
		W= new String[8][8];

		//미리 두가지 경우의 수를 가지는 8*8짜리 체스판모양 만들어놈
		for(int i = 0 ; i < 8 ; i ++) {
			for(int j = 0 ; j < 8 ; j++) {
				if((i%2 ==0 && j%2 ==0) || (i%2 != 0 && j%2 !=0)) {
					B[i][j] = "B";
					W[i][j] = "W";
				}
				else if((i%2 ==0 && j%2 !=0) || (i%2 !=0 && j%2 ==0)) {
					B[i][j] = "W";
					W[i][j] = "B";
				}
			}
		}


		int rowStart = 0;
		int colStart = 0;
		int cnt = 0;
		//시작위치를 rowStart , colStart 지점으로하고 한 사이클돌때마다 이를 초기화해줌
		while(colStart+8 <= col) {
			for(int i = rowStart ; i < rowStart+8 ; i++)
				for(int j = colStart ; j < colStart +8; j++) 
					cnt = compare(rowStart,colStart); //특정지점마다 cnt 세줌

			//cnt를 모두 담고
			list.add(cnt);
			cnt = 0;
			rowStart++;

			if(rowStart+8 > row) {
				rowStart = 0;
				colStart++;
			}
		}


		//최소값만 뽑기
		System.out.println(Collections.min(list));
	}	

	//rowStart,colStart 지점에서 8*8모양 map 이랑 미리 만들어둔 배열이랑 비교하고 틀린 갯수 셈
	public static int compare(int row , int col) {
		int value1 = 0;
		int value2 = 0;
		int value = 0;
		if(map[row][col].equals("B")) {
			for(int i = row  ; i < row+8 ; i++) {
				for(int j = col ; j < col+8 ; j++) {
					if(!B[i-row][j-col].equals(map[i][j])) 
						value1++;
					
					if(!W[i-row][j-col].equals(map[i][j])) 
						value2++;
					
				}
			}
		}
		else if(map[row][col].equals("W")) {
			for(int i = row  ; i < row+8 ; i++) {
				for(int j = col ; j < col+8 ; j++) {
					if(!W[i-row][j-col].equals(map[i][j]))
						value1++;
					if(!B[i-row][j-col].equals(map[i][j])) 
						value2++;
				}
			}
		}
		value = Math.min(value1, value2);
		return value;
	}
}