알고리즘

백준 1018 : 체스판 다시 칠하기 (Java)

만년다딱2 2021. 6. 2. 16:41

1. 문제링크

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

2. 접근방법

 

88 크기의 체스판으로 다시 칠하겠다고 한다.

 

즉! 88크기만큼의 BW, WB 체스판을 각각 구하고 더 작은 체스판과 대조한다면? 

 

정답이 나올것이라고 생각했다.

 

만들어둔 BW, WB 체스판에다가 하나하나 대조하여 카운트를 세고 더 작은 체스판으로 넣어준다면 된다!

3. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int N, M, ans;
	static String[] BW = { 
			"BWBWBWBW", 
			"WBWBWBWB", 
			"BWBWBWBW", 
			"WBWBWBWB", 
			"BWBWBWBW", 
			"WBWBWBWB", 
			"BWBWBWBW",
			"WBWBWBWB" };

	static String[] WB = { 
			"WBWBWBWB", 
			"BWBWBWBW", 
			"WBWBWBWB", 
			"BWBWBWBW", 
			"WBWBWBWB", 
			"BWBWBWBW", 
			"WBWBWBWB",
			"BWBWBWBW" };

	static String[] map;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new String[N];
		for (int i = 0; i < N; i++) {
			map[i] = br.readLine();
		}

		ans = Integer.MAX_VALUE;
		for (int i = 0; i <= N - 8; i++) {
			for (int j = 0; j <= M - 8; j++) {
				ans = Math.min(ans, Math.min(BWcnt(i, j), WBcnt(i, j)));
			}
		}
		System.out.println(ans);
	}

	static int BWcnt(int r, int c) {
		int cnt = 0;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				if (map[r + i].charAt(c + j) != BW[i].charAt(j))
					cnt++;
			}
		}
		return cnt;
	}

	static int WBcnt(int r, int c) {
		int cnt = 0;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				if (map[r + i].charAt(c + j) != WB[i].charAt(j))
					cnt++;
			}
		}
		return cnt;
	}
}

4. 마치며

제일 작은 판을 찾으면 된다는 말을 해석하는데 오래걸렸다!