본문 바로가기

백준 문제 풀이/c언어

백준 1018번 "체스판 다시 칠하기" -- C

728x90

안녕하세요! 오늘은 백준 1018번 "체스판 다시 칠하기" 문제를 풀어보겠습니다.

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

문제 설명

  • 체스판은 8x8크기이다. 가장 왼쪽 위 칸이 흰색이다.
  • 체스판을 색칠한 정보가 주어졌을 때, 다시 칠해야 하는 정사각형 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

  • 첫째 줄에 N과 M이 주어진다. (8 ≤ N, M ≤ 50)
  • 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색, W는 흰색이다.

출력

  • 첫째 줄에 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

풀이 방법

  1. 8x8 크기의 임시 체스판을 만든다.
  2. 입력으로 주어진 체스판 데이터와 임시 체스판을 비교하며 다시 칠해야 할 부분 카운트
  3. 가능한 8가지 경우를 모두 비교하여 카운트가 가장 작은 경우를 찾는다.

입력으로는 보드의 크기 N과 M이 주어지고, N개의 줄에는 보드의 각 행의 상태가 주어집니다. 검은색은 'B'로, 흰색은 'W'로 표시됩니다. 이 문제를 해결하기 위해서는 보드의 각 위치를 탐색하면서 체스판과 비교해야 합니다. 체스판은 검은색과 흰색이 번갈아가며 칠해져야 하므로, 현재 위치와 체스판의 색이 다른 경우에는 다시 칠해야 하는 정사각형의 개수를 증가시킵니다.

아래는 이 문제를 해결할 수 있는 C언어 코드입니다:

#include <stdio.h>

int main() {
    int N, M;
    scanf("%d %d", &N, &M);

    char board[50][50];
    for (int i = 0; i < N; i++) {
        scanf("%s", board[i]);
    }

    int minCount = 64;  // 최소 개수를 64로 초기화

    for (int i = 0; i <= N - 8; i++) {
        for (int j = 0; j <= M - 8; j++) {
            int count1 = 0;  // 맨 왼쪽 위가 'W'인 경우
            int count2 = 0;  // 맨 왼쪽 위가 'B'인 경우

            for (int x = i; x < i + 8; x++) {
                for (int y = j; y < j + 8; y++) {
                    // 체스판과 비교하여 다른 경우에는 카운트를 증가시킴
                    if ((x + y) % 2 == 0) {
                        if (board[x][y] != 'W') count1++;
                        if (board[x][y] != 'B') count2++;
                    } else {
                        if (board[x][y] != 'B') count1++;
                        if (board[x][y] != 'W') count2++;
                    }
                }
            }

            // 최소 개수 갱신
            if (count1 < minCount) minCount = count1;
            if (count2 < minCount) minCount = count2;
        }
    }

    printf("%d\n", minCount);

    return 0;
}

이 코드는 먼저 입력으로 받은 보드의 크기와 상태를 저장한 후, 모든 가능한 8x8 체스판을 탐색하면서 다시 칠해야 하는 정사각형의 최소 개수를 구합니다. 각 위치에서 체스판과 비교하여 다른 경우에는 카운트를 증가시키고, 최소 개수를 갱신합니다. 마지막으로 최소 개수를 출력합니다.

오늘도 화이팅!!

728x90