본문 바로가기

백준 문제풀기/JAVA

[백준 1018 JAVA 자바] 체스판 다시 칠하기

 

체스판을 칠하는데

"최소 개수를 구하는" 이라 함은

 

WBWB

BWBW

WBWB

BWBW

인지 (왼쪽 위가 W인지)

BWBW

WBWB

BWBW

WBWB

인지 (왼쪽 위가 B인지)

 

둘중 하나를 고르고

몇 칸이 차이나는지 고르라는 뜻이죠?

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int n = scan.nextInt();
		int m = scan.nextInt();
		
		int min=64;
		
		String[] arr = new String[n];
		
		char[][] chess = new char[n][m];
		scan.nextLine();
		for(int i=0;i<n;i++) {
			arr[i]=scan.nextLine();
			for(int j=0;j<m;j++) {
				chess[i][j]=arr[i].charAt(j);
			}
		}
		
		for(int i=0;i<=(n-8);i++) {
			for(int j=0;j<=(m-8);j++) {				
				if(functionB(chess,i,j)<min) {
					min = functionB(chess,i,j);
				}
				if(functionW(chess,i,j)<min) {
					min = functionW(chess,i,j);
				}
			}
		}
		System.out.println(min);
	}
	
	public static int functionB(char[][] c,int i,int j) {
		int count =0;
		
		for(int a=0;a<8;a++) {
			for(int b=0;b<8;b++) {
				if((i+a+j+b)%2==1&&c[i+a][j+b]=='B') {
					count+=1;
				}
				if((i+a+j+b)%2==0&&c[i+a][j+b]=='W') {
					count+=1;
				}
			}
		}
		return 64-count;
	}
	public static int functionW(char[][] c,int i,int j) {
		int count =0;
		for(int a=0;a<8;a++) {
			for(int b=0;b<8;b++) {
				if((i+a+j+b)%2==1&&c[i+a][j+b]=='W') {
					count+=1;
				}
				if((i+a+j+b)%2==0&&c[i+a][j+b]=='B') {
					count+=1;
				}
			}
		}
		return 64-count;
	}
}

 

functionB와 functionW를 이용해서

왼쪽위가 B인 경우, W인 경우를 둘다 구해서

둘중 작은 값을 구하도록 코딩했습니다

 

char[][] chess 는 체스판을 구현한 코드입니다

리스트( [] )를 두번 반복하면

행렬(matrix)형식으로 사용할 수 있습니다

 

N과M의 최소값이 8이기에

체스판은 최소 64칸을 가지고 있기에

int min = 64로 했습니다