1 분 소요

문제 링크

풀이 과정

임의의 높이와 폭을 가진 체크판을 받는다.

다음과 같이 10x10칸짜리 체크판을 입력받는다고 하면

image

8x8씩 체크판을 차례대로 검사하는 방법을 사용하면 된다.

image

image

image

image

위의 방법대로 문제에 적용하면 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());
    }
}

댓글남기기