<풀이>
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 |