https://www.acmicpc.net/problem/1018
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
String[][] map = new String[N][M];
for (int i = 0; i < N; i++) {
String[] input = br.readLine().split("");
for (int j = 0; j < M; j++) {
map[i][j] = input[j];
}
}
System.out.println(solve(N, M, map));
}
static int solve(int N, int M, String[][] map) {
//첫번째로 흰색이 나오는 경우와 검은색이 나오는 경우, 두가지로 나눔.
String[] whiteLine = { "W", "B", "W", "B", "W", "B", "W", "B" };
String[] blackLine = { "B", "W", "B", "W", "B", "W", "B", "W" };
//N-7, M-7까지로 범위를 정한 이유는 8 X 8범위에 대해 고려해야하기 때문이다.
//예를 들어 N이 9라면, [0 ~ 7], [1 ~ 8] 총 두 경우를 고려할 수 있다.
int result = Integer.MAX_VALUE;
for (int w = 0; w < N - 7; w++) {
for (int h = 0; h < M - 7; h++) {
int count = 0;
//whiteLine과 blackLine을 번갈아가며 비교하기 위한 플래그
boolean isCheck = false;
for (int i = w; i < w + 8; i++) {
//비교할 패턴의 인덱스
int idx = 0;
for (int j = h; j < h + 8; j++) {
//패턴에서 기대한 색깔과 다른 경우, count를 더함.
if (!isCheck) {
if (!whiteLine[idx].equals(map[i][j])) {
count++;
}
} else {
if (!blackLine[idx].equals(map[i][j])) {
count++;
}
}
idx++;
}
//한 줄을 모두 검사할 때 마다 플래그를 바꾸어 번갈아가며 패턴을 갖도록
isCheck = !isCheck;
}
//64 - count는 나올 수 있는 다른 패턴을 만들기 위한 개수를 의미함
//예를 들어 검은색부터 시작하는 체스판을 만들 때 하나만 변경해도 됐다면
//흰색부터 시작하는 체스판으로 만드려면 그 하나의 칸을 제외한 모든 칸을 변경해야 함.
int curResult = Math.min(count, 64 - count);
result = Math.min(result, curResult);
}
}
return result;
}
}
이번 문제의 경우, 알아두어야 코드 요소가 많기 때문에 주석으로 상세하게 설명함.
8 X 8크기의 영역
을 선택한다.B
와 W
가 번갈아서 나타나는 형태를 의미한다.8 X 8
영역을 골라 체스판 형태를 만들 수 있는 최소 색깔 변환 횟수
를 구하는 문제이다. 1) B W B W B W B W
2) W B W B W B W B
1번 패턴 -> 2번 패턴
, 2번 패턴 -> 1번 패턴
과 같이 순서가 변경될 수도 있다.두 경우가 존재
할 수 있다.N - 7
로 설정할 수 있다.예제 입력 6
을 테스트하면 알 수 있듯이 개수가 같아도 다른 경우가 존재한다.8 X 8
크기로 만들 수 있는 두 종류의 체스판을 만들기 위해 각각 필요한 변경 회수를 구하는 것었다.N-7
로 정하는 것과 같은 개념은 다른 문제를 풀 때도 유용할 것 같았다.