작성일 :

문제 링크

1018번 - 체스판 다시 칠하기

설명

8 x 8 크기의 체스판으로 자를 수 있는 판이 주어졌을 때,

체스판 각 칸의 색깔이 번갈아가면서 나오도록 만들기 위해 다시 칠해야하는 칸의 최소 개수를 구하는 문제입니다.

문제 해결을 위해서 체스판의 왼쪽 위 칸을 기준으로 두 가지 경우를 고려합니다.

  • 체스판의 왼쪽 위칸이 흰색인 경우 (WBWBWBWB...)
  • 체스판의 왼쪽 위칸이 검은색인 경우 (BWBWBWBW...)

이 두 가지 경우에 대해 가능한 모든 8 x 8 크기의 체스판을 고려하여, 각 경우마다 다시 칠해야 하는 칸의 개수를 세고,

이 중 최솟값을 출력합니다.


Code

[ C# ]

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
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var input = Console.ReadLine()!.Split(' ');
      var n = int.Parse(input[0]);
      var m = int.Parse(input[1]);

      var board = new string[n];
      for (int i = 0; i < n; i++)
        board[i] = Console.ReadLine()!;

      int res = 64;
      for (int i = 0; i <= n - 8; i++) {
        for (int j = 0; j <= m - 8; j++) {
          int case1 = 0, case2 = 0;
          for (int k = i; k < i + 8; k++) {
            for (int l = j; l < j + 8; l++) {
              if ((k + l) % 2 == 0) {
                if (board[k][l] != 'W') case1++;
                if (board[k][l] != 'B') case2++;
              } else {
                if (board[k][l] != 'B') case1++;
                if (board[k][l] != 'W') case2++;
              }
            }
          }
          res = Math.Min(res, Math.Min(case1, case2));
        }
      }

      Console.WriteLine(res);

    }
  }
}



[ C++ ]

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
#include <bits/stdc++.h>

using namespace std;

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

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

  vector<string> board(n);
  for (int i = 0; i < n; i++)
    cin >> board[i];

  int res = 64;
  for (int i = 0; i <= n - 8; i++) {
    for (int j = 0; j <= m - 8; j++) {
      int case1 = 0, case2 = 0;
      for (int k = i; k < i + 8; k++) {
        for (int l = j; l < j + 8; l++) {
          if ((k + l) % 2 == 0) {
            if (board[k][l] != 'W') case1++;
            if (board[k][l] != 'B') case2++;
          } else {
            if (board[k][l] != 'B') case1++;
            if (board[k][l] != 'W') case2++;
          }
        }
      }
      res = min(res, min(case1, case2));
    }
  }

  cout << res << "\n";

  return 0;
}