본문 바로가기

알고리즘

[백준] 1018번 체스판 다시 칠하기 C++ 문제풀이

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

문제 풀이

브루트포스 문제임을 알아도 어떤식으로 해결해야할지 막막했다.

다른 블로그 글을 참고하니 8X8의 체스판이라는 말이 중요했다.

8X8 체스판을 미리 만들어 두고 값이 다른 횟수가 최소인 경우를 출력하면 되는 문제였다.

소스 코드

#include <iostream>
#include <string>
using namespace std;

string board[51];
string WB[8] = {
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW"
};
string BW[8] = {
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB"
};

int WB_cnt(int x, int y)
{
    int cnt = 0;
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (board[x + i][y + j] != WB[i][j])
                cnt++;
        }

    }
    return cnt;
}

int BW_cnt(int x, int y)
{
    int cnt = 0;
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if (board[x + i][y + j] != BW[i][j])
                cnt++;
        }

    }
    return cnt;
}

int main() {
    int min_num = 9999999;
    int dx;
    int dy;
    cin >> dx >> dy;

    for (int i = 0; i < dx; i++)
        cin >> board[i];

    for (int i = 0; i + 8 <= dx; i++)
    {
        for (int j = 0; j + 8 <= dy; j++)
        {
            int tmp;
            tmp = min(WB_cnt(i, j), BW_cnt(i, j));
            if (tmp < min_num) {
                min_num = tmp;
            }
        }
    }
    cout << min_num;
    return 0;
}