https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
범위가 크지 않기 때문에, 모든 케이스를 검사하는 브루트 포스를 이용해 해결하는 문제이다.
처음에는 첫 글자만 받아 경우를 나누어 계산했는데, 첫글자를 색칠해 더 적어지는 경우가 존재하기 때문에 두 경우의 체스판과 비교해서 모든 cnt를 검사해야한다.
코드는 다음과 같다.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
int N, M, cnt1, cnt2, mini=9999999;
scanf("%d %d",&M,&N);
char board[M][N];
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
scanf(" %c",&board[i][j]);
}
}
for(int i=0; i<M-7; i++){
for(int j=0; j<N-7; j++){
cnt1 = 0;
cnt2 = 0;
//가장 왼쪽위가 B일 경우
for(int k=i; k<i+8; k++){
for(int q=j; q<j+8; q++){
if((k-i+q-j)%2==0 && board[k][q]=='W')
cnt1++;
if((k-i+q-j)%2==1 && board[k][q]=='B')
cnt1++;
}
}
for(int k=i; k<i+8; k++){
for(int q=j; q<j+8; q++){
if((k-i+q-j)%2==0 && board[k][q]=='B')
cnt2++;
if((k-i+q-j)%2==1 && board[k][q]=='W')
cnt2++;
}
}
mini = min(mini, cnt1);
mini = min(mini, cnt2);
}
}
printf("%d", mini);
}
'알고리즘 문제' 카테고리의 다른 글
[C/C++ 백준 1259번] 팰린드롬수 (Bronze 1) (Class 2) (0) | 2020.07.26 |
---|---|
[C/C++ 백준 1181번] 단어 정렬 (Silver 5) (Class 2) (0) | 2020.07.26 |
[C/C++ 백준 2475번] 검증수 (Bronze 5) (Class 1) (0) | 2020.07.26 |
[C/C++ 백준 2884번] 알람시계 (Bronze 3) (Class 1) (0) | 2020.07.26 |
[C/C++ 백준 2920번] 음계 (Bronze 2) (Class 1) (0) | 2020.07.26 |