문제 |
1018번: 체스판 다시 칠하기 (acmicpc.net)
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
코드 |
#include <iostream>
#include <vector>
using namespace std;
#define REP(i, n) for (int (i) = 0; (i) < (n); ++(i))
vector<string> v;
int count(int y, int x) {
int cnt[2]{};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
char c = ((i + j) % 2) ? 'B' : 'W';
for (int k = 0; k < 2; k++) {
if (v[y + i][x + j] != c) cnt[k]++;
c = (c == 'B') ? 'W' : 'B';
}
}
}
return min(cnt[0], cnt[1]);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
REP(i, n) {
string s;
cin >> s;
v.push_back(s);
}
int res = INT32_MAX;
for (int i = 0; i + 8 <= n; i++) {
for (int j = 0; j + 8 <= m; j++) {
res = min(res, count(i, j));
}
}
cout << res;
return 0;
}
설명 |
설명
vector<string>에 문자열을 집어넣으면 vector[y][x]로 각 char에 접근할 수 있다.
8*8 크기로 자를 수 있는 모든 경우의 수에 대하여,
BWBW~ 인 경우와 WBWB~ 인 경우로 나눠 체스판을 칠해야하는 경우의 최솟값을 구한다.
'PS > BOJ' 카테고리의 다른 글
[C++] BOJ (백준) 1181 : 단어 정렬 (0) | 2022.09.10 |
---|---|
[C++] BOJ (백준) 1085 : 직사각형에서 탈출 (0) | 2022.09.10 |
[C++] BOJ (백준) 11720 : 숫자의 합 (0) | 2022.09.09 |
[C++] BOJ (백준) 10818 : 최소, 최대 (0) | 2022.09.09 |
[C++] BOJ (백준) 8958 : OX퀴즈 (0) | 2022.09.08 |