문제 >
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8*8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
입력 >
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
출력 >
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
해결방법 >
시뮬레이션.
1) 체스판을 8 X 8 크기로 자른다.
2) 자른 체스판을 칠하는 방식을 0, 0 번째 원소를 기준으로 'B'로 칠하는 방식과 'W'로 칠하는 방식 두가지로 나누어 칠했을 때, 각각 총 칠해야하는 수를 구한다.
3) 체스판을 8 X 8 크기로 자를 수 있는 모든 경우까지 1) - 2) 과정을 반복해서 가장 적게 칠해야하는 수를 구한다.
[JAVA]
package baekjoon;
import java.util.*;
import java.io.*;
public class BOJ_1018 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] sa = br.readLine().split(" ");
int n = Integer.parseInt(sa[0]);
int m = Integer.parseInt(sa[1]);
char[][] board = new char[n][m];
int min = 64;
for(int i = 0; i < n; i++) {
String s = br.readLine();
for(int j = 0; j < m; j++) {
board[i][j] = s.charAt(j);
}
}
for(int i = 0; i <= n - 8; i++) {
for(int j = 0; j <= m - 8; j++) {
char[][] n_board = new char[8][8];
int one = 0;
int two = 0;
for(int k = 0; k < 8; k++) {
for(int l = 0; l < 8; l++) {
n_board[k][l] = board[i+k][j+l];
}
}
for(int k = 0; k < 8; k++) {
for(int l = 0; l < 8; l++) {
if(k % 2 == 0 && l % 2 == 0) {
if(n_board[k][l] == 'B') one++;
else two++;
}
else if(k % 2 == 0 && l % 2 == 1) {
if(n_board[k][l] == 'W') one++;
else two++;
}
else if(k % 2 == 1 && l % 2 == 0) {
if(n_board[k][l] == 'W') one++;
else two++;
}
else if(k % 2 == 1 && l % 2 == 1) {
if(n_board[k][l] == 'B') one++;
else two++;
}
}
}
min = Math.min(min, Math.min(one, two));
}
}
System.out.println(min);
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
[백준] 1697번 - 숨바꼭질 (0) | 2020.04.09 |
---|---|
[백준] 8061번 - Bitmap (0) | 2020.04.09 |
[백준] 1094번 - 막대기 (0) | 2020.04.09 |
[백준] 1647번 - 도시 분할 계획 (0) | 2020.04.05 |
[백준] 1922번 - 네트워크 연결 (0) | 2020.04.05 |
댓글