백준 25682: 체스판 다시 칠하기 2 / C++

2023. 3. 5. 12:43개인공부/코딩테스트

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

 

25682번: 체스판 다시 칠하기 2

첫째 줄에 정수 N, M, K가 주어진다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include<vector>
 
using namespace std;
 
int main() 
{
    cin.tie(NULL);
    std::cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    int Row, Col , K;
    cin >> Row >> Col >> K;
 
    vector<int> vec;
    int* rowsum = new int[Col];
    for (int i = 0; i < Col; ++i)
        rowsum[i] = 0;
 
    int Minimum = K*K;
    for (int irow = 0; irow < Row; ++irow)
    {
        int sum = 0;
        bool White = true;
        if (irow % 2 == 1)
            White = !White;
 
        string str;
        cin >> str;
        for (int icol = 0; icol < Col; ++icol)
        {
            int num = 0;
            if (str[icol] == 'W' && White == false)
                ++num;
            else if (str[icol] == 'B' && White == true)
                ++num;
            sum += num;
            rowsum[icol] += sum;
            vec.push_back(rowsum[icol]);
 
            White = !White;
 
            // 최솟값 계산
            if (icol + 1 >= K && irow + 1 >= K)
            {
                int ans = vec[irow * Col + icol];
                if (irow - K>= 0)
                {
                    ans -= vec[(irow - K) * Col + icol];
                }
                if (icol - K >= 0)
                {
                    ans -= vec[irow * Col + icol - K];
                }
                if (irow - K >= 0 && icol - K >= 0)
                    ans += vec[(irow - K) * Col + icol - K];
 
                if (ans > K * K / 2)
                    ans = K * K - ans;
                if (Minimum > ans)
                    Minimum = ans;
            }
 
        }
 
    }
 
    std::cout << Minimum;
    
 
    return 0;
}
 
cs