백준 1018번: 체스판 다시 칠하기

Se0ng_1l·2022년 6월 30일
0

백준

목록 보기
18/40

체스판이 완성되는 경우는 두가지다.

첫번째 경우는

홀수 번째 줄이 BWBWBWBW라면
짝수 번째 줄은 WBWBWBWB여야한다.

두번째 경우는

홀수 번째 줄이 WBWBWBWB라면
짝수 줄은 BWBWBWBW여야 한다.

풀이

반복문을 통해 8X8크기의 정사각형의 체스판을 얻은 후
경우에 따라 최소한의 색칠수를 구하고 두 경우의 최소값을 구한다.
그 다음 부턴, 최소값과 반복과정을 통해 나온 최소의 수를 비교해
최종적으로 가장 적게 칠하는 경우를 출력해주면 된다.

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

#include <iostream>
using namespace std;

int main()
{
    int col, row;
    cin >> row >> col;
    char **arr = new char*[row];
    char ans[2][8] = {{'W','B', 'W','B', 'W','B', 'W','B'},
                      {'B', 'W','B', 'W','B', 'W','B', 'W'}};
    for(int i = 0; i < row; i++)
        arr[i] = new char[col];
    for(int i = 0; i < row; i++){
        for(int j = 0; j < col; j++){
            cin >> arr[i][j];
        }
    }

    int c = 0, r = 0;
    int result = INT32_MAX;
    while(r + 7 < row)
    {
        int cnt_W = 0;
        int cnt_B = 0;
        int tmp = 0;
        for(int i = r; i < r + 8; i++)
        {
            for(int j = c; j < c + 8; j++)
            {
                if(tmp % 2 == 0)
                {
                    if (arr[i][j] != ans[0][j - c])
                        cnt_W++;
                }
                else
                {
                    if(arr[i][j] != ans[1][j - c])
                        cnt_W++;
                }
            }
            tmp++;
        }
        for(int i = r; i < r + 8; i++)
        {
            for(int j = c; j < c + 8; j++)
            {
                if(tmp % 2 == 0)
                {
                    if(arr[i][j] != ans[1][j - c])
                        cnt_B++;
                }
                else
                {
                    if(arr[i][j] != ans[0][j - c])
                        cnt_B++;
                }
            }
            tmp++;
        }
        int min = cnt_B > cnt_W ? cnt_W : cnt_B;
        if (result > min)
        {
            result = min;
        }
        if(c + 8 >= col){
            c = 0;
            r++;
        }
        else
            c++;
    }
    cout << result << endl;
    for(int i = 0; i < row; i++)
            delete [] arr[i];
    delete [] arr;
}
profile
치타가 되고 싶은 취준생

0개의 댓글