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

xyzw·2025년 8월 19일
0

algorithm

목록 보기
65/97

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

풀이

체스판의 두 가지 경우 - 맨 왼쪽 위 칸이 검은색인 경우, 흰색인 경우를 각각 BW, WB라는 이름의 string 배열로 만들어두고, 브루트포스 방식으로 입력받은 보드와 비교했다.

8*8 크기로 자른 보드를 BW, WB와 비교해서 각 경우의 칠해야 할 칸 수를 구한 후, 그 두 경우 중 최소값을 구한다.
이 과정을 보드 전체적으로 수행한 후 최종 최소값을 도출한다.

코드

#include <iostream>
#include <vector>

using namespace std;

vector<string> board;

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

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

int diffBW(int r, int c) {
    int diff = 0;
    for(int i=0; i<8; i++) {
        for(int j=0; j<8; j++) {
            if(board[r+i][c+j] != BW[i][j]) diff++;
        }
    }
    return diff;
}

int diffWB(int r, int c) {
    int diff = 0;
    for(int i=0; i<8; i++) {
        for(int j=0; j<8; j++) {
            if(board[r+i][c+j] != WB[i][j]) diff++;
        }
    }
    return diff;
}

int main()
{
    int N, M;
    cin >> N >> M;
    cin.ignore();
    
    for(int i=0; i<N; i++) {
        string s;
        cin >> s;
        board.push_back(s);
    }
    
    int minDiff = 100;
    for(int i=0; i+8<=N; i++) {
        for(int j=0; j+8<=M; j++) {
            int diff = min(diffBW(i, j), diffWB(i, j));
            if(diff < minDiff) minDiff = diff;
        }
    }
    
    cout << minDiff;
    
    return 0;
}

0개의 댓글