www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

<풀이>

1. 보드를 입력받는다.

2. 해당 보드에서 8x8 사이즈로 만들 수 있는 체스판 중, 색칠해야하는 최소 개수를 출력한다.

 

<해법>

모든 경우를 다 해보아야 합니다. 8x8 사이즈의 판을 탐색하면서, 해당 판에서 B 또는 W로 모두 칠해보고 최소값을 갱신합니다.

 

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
int N, M;
vector<string> map;
int answer;
 
//왼쪽 위가 B인 체스판
string Bchess[] = {
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB"
};
 
//왼쪽 위가 W인 체스판
string Wchess[] = {
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW"
};
 
//해당 좌표에서 칠하는 페인트의 최소 개수
int minPaintCount(int x, int y) {
 
    //왼쪽 위가 B인 체스판으로 만들 경우
    int BpaintCount = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if (map[i + x][j + y] != Bchess[i][j]) {
                BpaintCount++;
            }
        }
    }
 
    //왼쪽 위가 W인 체스판으로 만들 경우
    int WpaintCount = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if (map[i + x][j + y] != Wchess[i][j]) {
                WpaintCount++;
            }
        }
    }
 
    //최소값 반환
    return min(BpaintCount, WpaintCount);
}
 
int main() {
 
    //초기화
    answer = -1;
 
    //입력
    cin >> N >> M;
    for (int i = 0; i < N; i++) {
        string tmp;
        cin >> tmp;
        map.push_back(tmp);
    }
 
    //해법
    for (int i = 0; i <= N - 8; i++) {
        for (int j = 0; j <= M - 8; j++) {
 
            int minPaint = minPaintCount(i, j);
            
            //결과 갱신
            if (answer == -1 || minPaint < answer) {
                answer = minPaint;
            }
        }
    }
 
    //출력
    cout << answer;
 
    //종료
    return 0;
}
 

 

구현과 브루트포스에 대해 알아볼 수 있는 문제였습니다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 2447 - 별 찍기 10  (0) 2021.01.14
[C++] 백준 12100 - 2048(Easy)  (0) 2021.01.10
[C++] 백준 14502 - 연구소  (0) 2021.01.03
[C++] 백준 1120 - 문자열  (0) 2021.01.03
[C++] 백준 4949 - 균형잡힌 세상  (0) 2021.01.01

+ Recent posts