Baekjoon Online Judge
[문제]
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.
체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.
보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
[출력]
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.
[코드]
#include <iostream>
#include <string>
using namespace std;
string board[50];
int WB_count(int x, int y);
int BW_count(int x, int y);
string WB[8] = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"
};
string BW[8] = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"
};
int WB_count(int x, int y)
{
int cnt = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (board[x + i][y + j] != WB[i][j])
cnt++;
}
}
return cnt;
}
int BW_count(int x, int y)
{
int cnt = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (board[x + i][y + j] != BW[i][j])
cnt++;
}
}
return cnt;
}
int main()
{
int N, M, sum = 65;
cin >> N >> M;
cin.ignore();
for (int i = 0; i < N; i++)
getline(cin, board[i]);
for (int i = 0; i + 8 <= N; i++)
{
for (int j = 0; j + 8 <= M; j++)
{
int tmp = min(WB_count(i, j), BW_count(i, j));
if (tmp < sum)
sum = tmp;
}
}
cout << sum << '\n';
return 0;
}
'Baekjoon > C++' 카테고리의 다른 글
[C++][BOJ/백준] 2822 점수 계산 (0) | 2024.07.12 |
---|---|
[C++][BOJ/백준] 1920 수 찾기 (0) | 2024.07.09 |
[C++][BOJ/백준] 10867 중복 빼고 정렬하기 (0) | 2024.06.28 |
[C++][BOJ/백준] 7568 덩치 (0) | 2024.06.27 |
[C++][BOJ/백준] 10989 수 정렬하기 3 (0) | 2024.06.22 |