코딩 테스트
[백준] 1018번 : 체스판 다시 칠하기 - JAVA[자바]
Mong-_-
2023. 12. 3. 17:26
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
■ 문제

■ 문제 이해
이해하기 어려운 문제는 아니다.
체스판의 특성상 나올 수 있는 경우의 수는 두 가지가 있다.
1. 시작 위치(맨 왼쪽 위)가 'B'로 시작되는 경우
2. 시작 위치(맨 왼쪽 위)가 'W'로 시작되는 경우
이때, 주의해야 하는 점은 첫 번째 칸이 'B'일 경우와 'W' 일 경우를 모두 구한 후 비교하여 최솟값을 구해야 한다.
바로 풀어보쟈잇
■ 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public 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());
// board 배열은 'B', 'W' 두 가지만 입력되기 때문에 boolean 배열로 선언했다.
boolean[][] board = new boolean[n][m];
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < m; j++) {
if (str.charAt(j) == 'W') {
board[i][j] = true;
continue;
}
}
}
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, calculateBoard(board, i, j));
}
}
System.out.println(min);
}
private static int calculateBoard(boolean[][] board, int y, int x) {
boolean color = board[y][x];
int count = 0;
for (int i = y; i < y + 8; i++) {
for (int j = x; j < x + 8; j++) {
if (board[i][j] != color) {
count++;
}
// 색 변경
color = !color;
}
/*
* 'B'로 끝났다면 다음 줄은 또 'B'로 시작한다.
* 위에서 color를 바꾸기 때문에 한 번더 바꿔주어서 되돌린다.
*/
color = !color;
}
/*
* board를 전부 바꿔야하는 최악의 경우 count = 64이다. (8 * 8이므로)
* 하지만 시작 위치(윈쪽 맨 위)를 반대로 시작하게 된다면 바꿀게 아무것도 없으므로 count = 0이다.
* 즉, 시작 위치를 정하고 count를 구했다면, 그 반대 시작은 64 - count가 되는 것이다.
* 만약 64 - count를 하지 않는다면 시작 위치를 반대로 설정한 후 count 값과 비교해야 한다.
*/
return Math.min(64 - count, count);
}
}