백준 단계별로 풀어보기 [브루트포스] 체스판 다시 칠하기
https://www.acmicpc.net/problem/1018
[풀이]
8*8 체스판을 만들기 위해 다시 칠해야 하는 정사각형의 최소 개수를 구하는 문제이다. 브루트포스 문제로 모든 경우의 수를 검사한다. 체스판의 시작인 맨 왼쪽 위 정사각형이 흰색인 경우 다시 칠해야 하는 정사각형 카운트를 w_cnt로, 검정색인 경우 다시 칠해야 하는 정사각형 카운트를 b_cnt로 해서 가장 작은 min_cnt값을 구한다.
[코드]
#include <iostream>
#include <algorithm>
char board[50][50];
int main() {
int m, n;
std::string s;
std::cin >> m >> n;
for (int i = 0; i < m; i++) {
std::cin >> s;
for (int j = 0; j < n; j++) {
board[i][j] = s[j];
}
}
int min_cnt = 10000;
int w_cnt, b_cnt; // 시작이 white, 시작이 black.
for (int i = 0; i < m - 7; i++) {
for (int j = 0; j < n - 7; j++) {
w_cnt = 0, b_cnt = 0;
for (int k = i; k < i + 8; k++) {
for (int l = j; l < j + 8; l++) {
if (k % 2 == 0) {
if (l % 2 == 0) {
if(board[k][l] == 'B')
w_cnt++;
else
b_cnt++;
}
else if (l % 2 == 1) {
if(board[k][l] == 'W')
w_cnt++;
else
b_cnt++;
}
}
else if (k % 2 == 1) {
if (l % 2 == 1) {
if(board[k][l] == 'B')
w_cnt++;
else
b_cnt++;
}
else if (l % 2 == 0) {
if(board[k][l] == 'W')
w_cnt++;
else
b_cnt++;
}
}
}
}
if(min_cnt > std::min(w_cnt, b_cnt))
min_cnt = std::min(w_cnt, b_cnt);
}
}
std::cout << min_cnt;
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[c++] 백준 11286 절댓값 힙 (0) | 2021.08.07 |
---|---|
[c++] 백준 11279, 1927 최대 힙, 최소 힙 (0) | 2021.08.07 |
[c++] 백준 17298 오큰수 (0) | 2021.08.04 |
[c++] 9461 파도반 수열 (0) | 2021.08.04 |
[c++] 백준 2156 포도주 시식 (0) | 2021.08.03 |