백준 1018번 체스판 다시 칠하기(JAVA)

민성재·2021년 4월 17일
0

Algorithm & Coding Test

목록 보기
5/20

[풀이 방법]
먼저 8*8 체스판의 구성은 B로 시작하는 경우 , W로 시작하는 경우 두가지뿐이므로 미리 두 개의 체스판을 미리 만들어 두었다.

여기서 주어지는 입력은 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;
	}
}


profile
민성재 개발 블로그

0개의 댓글