공부/백준

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

상연 2020. 10. 25. 17:30

목차

    1018번: 체스판 다시 칠하기 링크

    코드

    #include <iostream>
    using namespace std;
    
    char case1[8][9] = {
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
    };
    
    char case2[8][9] = {
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
        "BWBWBWBW",
        "WBWBWBWB",
    };
    
    int main() {
        char chess[50][50];
    
        int n, m;
        cin >> n >> m;
    
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                cin >> chess[i][j];
            }
        }
    
        int min = 64;
        int cnt_1 = 0;
        int cnt_2 = 0;
        for(int k = 0; k <= n - 8; k++){
            for(int l = 0; l <= m - 8; l++){
                cnt_1 = 0;
                cnt_2 = 0;
                for(int x = k; x < k + 8; x++){
                    for(int y = l; y < l + 8; y++){
                        if(chess[x][y] != case1[x - k][y - l]) cnt_1++;
                        if(chess[x][y] != case2[x - k][y - l]) cnt_2++;
                    }
                }
                if(cnt_1 < cnt_2) min = cnt_1 < min ? cnt_1 : min;
                else min = cnt_2 < min ? cnt_2 : min;
            }
        }
        cout << min;
    }

    사견

    문제를 읽어보면, 체스판을 칠할 수 있는 경우의 수는 2가지이다.
    첫번째가 'W' 인 경우
    첫번째가 'B' 인 경우

    따라서 이러한 경우 2 가지를 애초에 char[8][8] 배열로 만들어둔다.

    이후 입력받은 보드에서
    만들 수 있는 모든 8X8 보드의 경우의 수를 다 돌려보면서

    위의 두 가지 case와 비교한다.

    각 각의 case와 다른 칸이 있을때마다 카운트 한 후,
    두 case 중 더 작은수를 찾은 후

    여태까지의 찾은 경우의 작은수보다 작으면 교체한다.

    '공부 > 백준' 카테고리의 다른 글

    2750번: 수 정렬하기(백준 C++)  (0) 2020.10.27
    1436번: 영화감독 숌(백준 C++)  (0) 2020.10.26
    7568번: 덩치(백준 C++)  (0) 2020.10.24
    2231번: 분해합(백준 C++)  (0) 2020.10.23
    2798번: 블랙잭(백준 C++)  (0) 2020.10.22