체스판 다시 칠하기
09 July 2019
문제 : https://www.acmicpc.net/problem/1018
이번은 체스판을 만드는 모든 경우를 시도하여 최적의 방법을 찾는 문제를 풀어보도록 하겠습니다.
import java.util.Scanner;
public class Main {
private static char[][] mat;
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int width = sc.nextInt();
int height = sc.nextInt();
mat = new char[width][height];
for (int i = 0; i < width; i++) {
String val = sc.next();
for (int k = 0; k < height; k++) {
mat[i][k] = val.charAt(k);
}
}
int min = Integer.MAX_VALUE;
for (int i = 0; i < width - 7; i++) {
for (int k = 0; k < height - 7; k++) {
int ret = getMin(i, k);
if (ret < min) {
min = ret;
}
}
}
System.out.println(min);
}
private static int getMin(int widthStart, int heightStart) {
int min = Integer.MAX_VALUE;
int sum = 0;
for (int i = 0; i < 8; i++) {
for (int k = 0; k < 8; k++) {
if ((i + k) % 2 == 0) {
if (mat[i + widthStart][k + heightStart] != 'B') {
sum++;
}
} else {
if (mat[i + widthStart][k + heightStart] != 'W') {
sum++;
}
}
}
}
min = sum;
sum = 0;
for (int i = 0; i < 8; i++) {
for (int k = 0; k < 8; k++) {
if ((i + k) % 2 == 0) {
if (mat[i + widthStart][k + heightStart] != 'W') {
sum++;
}
} else {
if (mat[i + widthStart][k + heightStart] != 'B') {
sum++;
}
}
}
}
if (sum < min) {
min = sum;
}
return min;
}
}
이번은 전체를 반복하여 반복되는 모양인 체스판을 만드는 문제를 풀어보도록 하겠습니다.가장 위에 있는 값이 B 혹은 W로 반복되어야 하고, 두 칸에 하나씩 반복되는 모양이므로 아래와 같이 나타날 수 있습니다.
처음이 (0,0)인 경우, (0,2),(0,4), 그다음 칸에서는 (1,1),(1,3)순으로 나타나게 됩니다.
규칙을 보면 x,y이 합의 값이 모두 짝수인 것을 알 수 있습니다.
해당 규칙으로 B,W를 번갈아가면서 체크하여 가장 작은 횟수를 구해줍니다.