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;
}

+ Recent posts