1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
1. N x M 크기의 배열에서 8 x 8 만큼만 잘라내는 법
2. 8 x 8 크기의 배열에서 흰색과 검정색을 교차로 설정하는 법
위의 2가지를 알면 쉽게 구현할 수 있는 브루트포스 문제입니다.
입력이 주어지면 위의 그림만큼 8 x 8만큼 씩만 탐색을 해야하며,
그 내부에서 교차로 선택하는 방법을 알아야 합니다.
for(int i = 0; i <= n - 8; i++) {
for(int j = 0; j <= m - 8; j++) {
~~~
~~~
}
}
이 부분이 배열에서 8 x 8 만큼씩 탐색하는 방법이고
그 밑의 조건문은 흰색과 검정색을 교차로 놓는 부분입니다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
string s[50];
int main() {
int n,m;
cin>>n>>m;
for(int i = 0; i < n; i++) {
cin>>s[i];
}
int coun, coun2, ans = 100;
for(int i = 0; i <= n - 8; i++) {
for(int j = 0; j <= m - 8; j++) { //1번 부분
coun2 = coun = 0;
for(int k = 0; k < 8; k++) {
for(int l = 0; l < 8; l++) {
if((k + i) % 2 == 0 && (l + j) % 2 == 0 && s[k + i][l + j] == 'B') coun++; //2번 부분
if((k + i) % 2 == 1 && (l + j) % 2 == 1 && s[k + i][l + j] == 'B') coun++;
if((k + i) % 2 == 1 && (l + j) % 2 == 0 && s[k + i][l + j] == 'W') coun++;
if((k + i) % 2 == 0 && (l + j) % 2 == 1 && s[k + i][l + j] == 'W') coun++;
if((k + i) % 2 == 0 && (l + j) % 2 == 0 && s[k + i][l + j] == 'W') coun2++;
if((k + i) % 2 == 1 && (l + j) % 2 == 1 && s[k + i][l + j] == 'W') coun2++;
if((k + i) % 2 == 1 && (l + j) % 2 == 0 && s[k + i][l + j] == 'B') coun2++;
if((k + i) % 2 == 0 && (l + j) % 2 == 1 && s[k + i][l + j] == 'B') coun2++;
}
}
ans = min({ans, coun, coun2});
}
}
cout<<ans;
}
'백준' 카테고리의 다른 글
[C++] 백준 | 1790번 수 이어 쓰기 2 (0) | 2023.02.15 |
---|---|
[C++] 백준 | 27313번 효율적인 애니메이션 감상 (0) | 2023.02.10 |
[C++] 백준 | 19590번 비드맨 (0) | 2023.02.06 |
[C++] 백준 | 17143번 낚시왕 (0) | 2023.02.03 |
[C++] 백준 | 14226번 이모티콘 (0) | 2023.01.31 |