[백준 1018] 체스판 다시 칠하기 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
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;
}