체스판 다시 칠하기2
title: 2026-02-18 author: 강병호 (이름) date: 2026-02-18 (날짜) category: TIL/강병호/2026/02 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —
import java.io.*;
import java.util.*;
public class Q25682 {
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());
int K = Integer.parseInt(st.nextToken());
char[][] arr = new char[N][M];
int[][] psum = new int[N+1][M+1];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
String s = st.nextToken();
arr[i] = s.toCharArray();
}
// B 시작을 기준으로 작성
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// 1. 현재 칸의 정상 유무 확인
boolean isBlack = ((i + j) % 2 == 0);
int value = 0;
// 예산한 색과 다르면 1
if (isBlack && arr[i][j] == 'W') value=1;
if (!isBlack && arr[i][j] == 'B') value = 1;
psum[i+1][j+1] = psum[i][j+1] + psum[i+1][j] - psum[i][j] + value;
}
}
int count = Integer.MAX_VALUE;
for (int i = 1; i <= N - K + 1; i++) {
for (int j = 1; j <= M - K + 1; j++) {
int cnt = psum[i+K-1][j+K-1] - psum[i-1][j+K-1]
- psum[i+K-1][j-1] + psum[i-1][j-1];
count = Math.min(count, Math.min(cnt, K * K - cnt));
}
}
System.out.println(count);
}
}