본문 바로가기

Programming/BOJ Solutions

[백준 1018번] 체스판 다시 칠하기

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB47581609134737.077%

문제

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N크기의 보드를 찾았다. 어떤 정사각형은 검정색으로 칠해져있고, 나머지는 흰색으로 칠해져 있다. 지민이는이 보드를 잘라서 8*8크기의 체스판으로 만드려고 한다.

하지만 지민이는 이 보드가 체스판처럼 검정/흰색 패턴이 번갈아가며 색칠해져있지 않기 때문에 고민에 빠졌다. 따라서 지민이는 8*8크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야 겠다고 생각했다. 당연히 8*8크기는 아무데서나 골라도 된다.

현재 보드의 색이 어떤지 상태가 주어질 때, 지민이가 8*8크기로 자른 뒤에 다시 칠해야하는 정사각형 개수의 최솟값을 구하는 프로그램을 작성하시오.

체스판은 각 정사각형이 검정 또는 흰색이며, 변을 공유하는 두 개의 사각형이 같은 색이 아닐 때 이다. 따라서 위 정의에 의하면 체스판의 색은 항상 두 가지가 가능한데, 하나는 왼쪽 위 코너가 흰색인 것, 검정색인 것 두가지이다.

입력

첫째 줄에 N과 M이 주어진다. M과 N은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개 줄에는 체스판의 색 상태가 주어진다. B는 검정색이며, W는 흰색이다.

출력

첫째 줄에 지민이가 8*8크기로 자른 뒤에 다시 칠해야하는 정사각형 개수의 최솟값을 출력한다.

예제 입력 1 

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

예제 출력 1 

1

예제 입력 2 

10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

예제 출력 2 

12


브루트 포스 알고리즘을 사용하는 문제, 체스판의 총 경우는 W로 시작, B로 시작 두 가지 뿐이라고 생각하고 문제를 풀면 쉽게 풀린다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream>
 
using namespace std;
 
int N,M, value = 999999;
char map[51][51];
 
void solve(int,int);
 
int main(){
 
    cin >> N >> M;
 
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            cin >> map[i][j];
        }
    }
 
    for(int i=0;i<=N-8;i++){
        for(int j=0;j<=M-8;j++){
            solve(i,j);
        }
    }
 
    cout << value;
 
    return 0;
}
 
void solve(int a,int b){
 
    int count = 0;
    bool color = true//black : true .. white : false
 
    //Black Start
    for(int i=0;i<8;i++){
        if(i%2==0) color = true;
        else color = false;
        for(int j=0;j<8;j++){
            if(color == true && map[a+i][b+j] == 'W') count++;
            else if(color == false && map[a+i][b+j] == 'B') count++;
            color = !color;
        }
    }
 
    value = count < value ? count : value;
 
    count = 0;
 
    //White Start
    for(int i=0;i<8;i++){
        if(i%2==0) color = false;
        else color = true;
        for(int j=0;j<8;j++){
            if(color == true && map[a+i][b+j] == 'W') count++;
            else if(color == false && map[a+i][b+j] == 'B') count++;
 
            color = !color;
        }
    }
 
    value = count < value ? count : value;
}
cs


'Programming > BOJ Solutions' 카테고리의 다른 글

[백준 13458번] 시험 감독  (0) 2018.06.19
[백준 1260번] DFS와 BFS  (0) 2018.06.19
[백준 12100번] 2048 (Easy)  (0) 2018.06.19
[백준 1194번] 달이 차오른다, 가자  (0) 2018.06.19
[백준 1003번] 피보나치 함수  (0) 2018.06.19