집게사장의 꿈

백준 C# 1018 체스판 다시 색칠하기 본문

기타/백준

백준 C# 1018 체스판 다시 색칠하기

Krapboss 2024. 8. 28. 21:29

문제

주어진 배열에서 B W의 쌍을 이루는 체스판을 만들기 위해 배열을 자를 때, 최소한의 수정 개수를 출력

 

해결

입력받은 Map 배열을 통해 BW 순서를 고려하여 체스판의 정렬 상태를 판단하고, 체스판에서의 8X8 배열에 대해 가장 작은 값을 비교하여 출력한다.
이때, 미리 순서에 맞는 문자인지 판단하는 것을 먼저 했다.

string[] input(StreamReader s) => s.ReadLine().Split();

using (StreamReader sr = new StreamReader(Console.OpenStandardInput()))
{
    int[] arr = Array.ConvertAll(input(sr), int.Parse);

    //int[] W = { 87,66 };
    int[] B = { 66,87 };

    int[][] map = new int[arr[0]][];
    for(int i =0; i < arr[0]; i++)
    {
        map[i] = input(sr)[0].Select(num => (int)num).ToArray();
    
    }

    int[,] BW = new int[arr[0], arr[1]];
    //int[,] WB = new int[arr[0], arr[1]];

    //B - W  순서를 고려하여 현재 위치의 값이 바르다면 0 틀리다면 1을 저장
    for (int i =0; i< arr[0]; i++)
    {
        for(int j = 0; j < arr[1]; j++)
        {
            BW[i,j] = map[i][j] != B[(i+j) % 2] ? 1 : 0;
            //WB[i,j] = map[i][j] != W[i+j % 2] ? 1 : 0;
        }
    }

    //Row와 Colume값의 판단을 위해 최대값을 지정합니다.
    int x = arr[0] - 8 + 1;
    int y= arr[1] - 8 + 1;

    int min = 65;

    //8x8 배열에 대해 최소값을 판단합니다.
    for( int i = 0; i < x; i++)
    {
        for(int j = 0;j < y; j++)
        {
            //[i+8 , j+8] 번째의 배열까지의 값들을 모두 더한다.
            int sum = Enumerable.Range(i,8)
                .SelectMany(row => Enumerable.Range(j, 8)
                                           .Select(col => BW[row,col]))
                .Sum();

            //가장 작은 수정치를 판단
            min = Math.Min(min, Math.Min(sum, 64 - sum));
        }
    }

    Console.Write(min);
}

'기타 > 백준' 카테고리의 다른 글

백준 C# 좌표정렬하기 11650  (0) 2024.08.28
백준 C# 10814 나이순 정렬  (0) 2024.08.28
백준 C# 평범한배낭 12865  (0) 2024.08.15
백준 C# LCS 9251  (1) 2024.08.15
백준 C# 1916 최소비용 구하기  (0) 2024.08.10