본문 바로가기

PS/BOJ

[C++] BOJ (백준) 1018 : 체스판 다시 칠하기

문제

1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

코드
#include <iostream>
#include <vector>

using namespace std;

#define REP(i, n) for (int (i) = 0; (i) < (n); ++(i))

vector<string> v;

int count(int y, int x) {
    int cnt[2]{};

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            char c = ((i + j) % 2) ? 'B' : 'W';
            for (int k = 0; k < 2; k++) {
                if (v[y + i][x + j] != c) cnt[k]++;
                c = (c == 'B') ? 'W' : 'B';
            }
        }
    }
    return min(cnt[0], cnt[1]);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    REP(i, n) {
        string s;
        cin >> s;
        v.push_back(s);
    }

    int res = INT32_MAX;

    for (int i = 0; i + 8 <= n; i++) {
        for (int j = 0; j + 8 <= m; j++) {
            res = min(res, count(i, j));
        }
    }

    cout << res;
    return 0;
}

 

설명

설명
vector<string>에 문자열을 집어넣으면 vector[y][x]로 각 char에 접근할 수 있다.
8*8 크기로 자를 수 있는 모든 경우의 수에 대하여,
BWBW~ 인 경우와 WBWB~ 인 경우로 나눠 체스판을 칠해야하는 경우의 최솟값을 구한다.