Programing/BaekJoon
[JAVA] 백준 1018 : 체스판 다시 칠하기(완전탐색)
블스뜸
2025. 3. 29. 17:07
부르트 포트(완전탐색)를 이용한 풀이
1) main 내부에서 2중 반복문을 이용해 8*8체스판이 될 수 있는 시작점을 탐색
2) solve를 작성
3) White로 시작하는 체스판은 몇번을 칠해야 하는지 탐색 (start를 사용한 for문) = start가 0일 때
4) Black으로 시작하는 체스판은 몇번을 칠해야 하는지 탐색 (start를 사용한 for문) = start가 1일 때
5) 두 결과를 비교해서 더 낮은 값 반환
* 1로 시작점이 탐색되면 2~5반복
6) 최종적으로 가장 낮은 값을 출력
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
char[][] board = new char[n][m];
for (int i = 0; i < n; i++) {
board[i] = br.readLine().toCharArray();
}
int min = Integer.MAX_VALUE;
for (int i = 0; i <= n - 8; i++) {
for (int j = 0; j <= m - 8; j++) {
min = Math.min(min, solve(board, i, j));
}
}
bw.write(String.valueOf(min));
bw.flush();
bw.close();
br.close();
}
public static int solve(char[][] board, int x, int y) {
char[] colors = {'W', 'B'};
int min = Integer.MAX_VALUE;
// B가 시작했을 때 변경해야하는 수와 W가 시작했을 때 변경해야하는 수를 비교 하기위해
// start를 이용해 2번 반복(Math.min(W로 시작할 경우, B로 시작할 경우)
for (int start = 0; start < 2; start++) {
int count = 0;
for (int i = x; i < x + 8; i++) {
for (int j = y; j < y + 8; j++) {
if (board[i][j] != colors[(i + j + start) % 2]) {
count++;
}
}
}
min = Math.min(min, count);
}
return min;
}
}