c# 백준 1018 체스판 다시 칠하기
풀이 과정
임의의 높이와 폭을 가진 체크판을 받는다.
다음과 같이 10x10칸짜리 체크판을 입력받는다고 하면
8x8씩 체크판을 차례대로 검사하는 방법을 사용하면 된다.
…
위의 방법대로 문제에 적용하면 N * M넓이의 체크판을 입력받는다. 이 체크판을 배열 안에 담아두고
char[,] checkerboard = new char[N, M];
입력받은 체크판에서 모든 8x8의 체크판을 검사한다.
for (int i = 0; i <= N - 8; i++)
{
for (int j = 0; j <= M - 8; j++)
{
//8x8검사
}
}
옳바른 체크판을 검사할때 올바른 8x8 체크판
의 경우 왼쪽 위
가 검은색으로 시작하는 체크판
과
하얀색으로 시작하는 체크판
두 가지 경우가 있다.
그러므로 두 가지 경우 모두 검사하며,
검사하며 나온 바꿔야할 체크판을 만들어 둔 List안에 저장
한 뒤
모든 검사가 끝나면 List에 담긴 바꿔야할 체크판 숫자중 가장 작은 숫자를 출력
한다.
전체 코드
class Program
{
static void Main(string[] args)
{
List<int> count = new List<int>(); // 검사한 뒤 몇 칸을 고쳐야 하는지 담아둘 곳
string[] s = Console.ReadLine().Split(' ');
int N = int.Parse(s[0]);
int M = int.Parse(s[1]);
char[,] checkerboard = new char[N, M];
for (int i = 0; i < N; i++)
{
string line = Console.ReadLine();
char[] rooms = line.ToCharArray();
for (int j = 0; j < M; j++)
{
checkerboard[i, j] = rooms[j];
}
}
// 모든 체스판 검사
for (int i = 0; i <= N - 8; i++)
{
for (int j = 0; j <= M - 8; j++)
{
int leftUpW = 0; // 왼쪽 위가 W인 체크판을 기준으로 하였을때 바꿔야하는 칸 개수
int leftUpB = 0; // 왼쪽 위가 B인 체크판을 기준으로 하였을때 바꿔야하는 칸 개수
// 한 칸을 기준으로 아래오른쪽으로 8칸씩의 체스판을 검사
for (int k = 0; k < 8; k++)
{
for (int l = 0; l < 8; l++)
{
//체스판처럼 번갈아가면서 W와B가 나오는지 확인
if ((k + l) % 2 == 0)
{
switch (checkerboard[i + k, j + l])
{
case 'W':
leftUpB++;
break;
case 'B':
leftUpW++;
break;
}
}
else
{
switch(checkerboard[i + k, j + l])
{
case 'W':
leftUpW++;
break;
case 'B':
leftUpB++;
break;
}
}
}
}
count.Add(leftUpW);
count.Add(leftUpB);
}
}
Console.WriteLine(count.Min());
}
}
댓글남기기