백준문제 브루트 포스 체스판 다시 칠하기(1018) 체스판을 만드는 모든 경우를 시도하여 최적의 방법을 찾는 문제
문제
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M_N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8_8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8_8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8_8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
출력
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
예제 입력
Copy 8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
예제 출력
예제 입력2
Copy 10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
예제 출력2
아 왜틀리냐고 실행해보면 다 맞는거같은데 -> 최소갯수?
boolean으로 해서는 방법이 없는걸까? -> int으로 변환해서 사용
문제의 이해가 덜 됬었던거같다 => 8x8으로 잘라서 확인하는데, 여기서 확인하는 체스판(B시작, W시작)인지 정하는게 아니라 둘 다 확인하고 그 중에서 최소값을 제출하는 방식인것!!!!
+if문을 그지같이 짰었음(i 범위를 따로 재고, j 범위를 따로 쟀었는데) 친구의 도움으로 걍 더해서 확인하는 것이 코드의 양/가독성 모두 한꺼번에 처리해준다는 것을 알려줌 ㅠㅠ 감사합니다
풀이
Copy import java.util.*;
public class Test{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
//8x8 기준으로 다 바꿀때(최대값)은 64
int count=0, min = 64;
String arr[][] = new String[N][M];
for(int i=0; i<N; i++){
String[] tmp = sc.next().split("");
for(int j=0; j<M; j++){
arr[i][j] = tmp[j];
}
}
for(int i=0; i<N-7; i++){
for(int j=0; j<M-7; j++){
count = cc(arr, i, j);
if(min > count){
min = count;
}
}
}
System.out.println(min);
}
public static int cc(String arr[][], int x, int y){
int c1 = 0;
int c2 = 0;
//18번도는거 확인
//System.out.println("Starts With B");
for(int i=x; i<x+8; i++){
for(int j=y; j<y+8; j++){
if((i+j)%2==0) {
//이거 더해서.... 좋은꿀팁
//제대로된 판을 그려보면 arr[i][j]에 B가 있어야함
//근데 B가 아니라 W가 있다면 바꿔줘야하니까 ++
if (arr[i][j].equals("W") == true){
//System.out.println(arr[i][j]+" is W");
c1++;
}
}
else if((i+j)%2==1) {
//여기에는 arr[i][j]에 W가 있어야하지만
//B가 있다면 바꿔줘야하니까 ++
if (arr[i][j].equals("B") == true){
//System.out.println(arr[i][j]+" is B");
c1++;
}
}
}
}
for(int i=x; i<x+8; i++){
for(int j=y; j<y+8; j++){
if((i+j)%2==0) {
if (arr[i][j].equals("B") == true)
c2++;
}
else if((i+j)%2==1) {
if (arr[i][j].equals("W") == true)
c2++;
}
}
}
if(c1 > c2)
return c2;
else
return c1;
}
}
백준