본문 바로가기

백준 문제 풀이/c언어

백준 1018 C언어 문제 풀이 - 체스판 다시 칠하기

728x90

문제를 간단히 설명하면, M x N 크기의 보드가 주어졌을 때, 체스판처럼 칠해진 부분과 다른 색으로 칠해진 부분을 반복해서 칠해야 할 때, 다시 칠해야 하는 정사각형의 최소 개수를 구하는 문제입니다.

문제를 풀면 아래 코드가 나옵니다.

#include <stdio.h>
#include <stdlib.h>

char board[50][50];

int check_board(int row, int col) {
    int i, j, count1 = 0, count2 = 0;
    char color1 = 'W', color2 = 'B';

    // (row, col)이 W로 시작하는 체스판과 비교
    for (i = row; i < row + 8; i++) {
        for (j = col; j < col + 8; j++) {
            if (board[i][j] != color1) {
                count1++;
            }
            color1 = (color1 == 'W') ? 'B' : 'W';
        }
        color1 = (color1 == 'W') ? 'B' : 'W';
    }

    // (row, col)이 B로 시작하는 체스판과 비교
    for (i = row; i < row + 8; i++) {
        for (j = col; j < col + 8; j++) {
            if (board[i][j] != color2) {
                count2++;
            }
            color2 = (color2 == 'W') ? 'B' : 'W';
        }
        color2 = (color2 == 'W') ? 'B' : 'W';
    }

    return (count1 < count2) ? count1 : count2;
}

int main() {
    int N, M, i, j, ans = 2500;

    scanf("%d %d", &N, &M);

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

    for (i = 0; i < N - 7; i++) {
        for (j = 0; j < M - 7; j++) {
            int count = check_board(i, j);
            if (count < ans) {
                ans = count;
            }
        }
    }

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

    return 0;
}

위 코드에서 board는 보드를 나타내는 이차원 배열입니다. check_board 함수는 (row, col)부터 시작하는 체스판을 W로 시작하는 체스판과 B로 시작하는 체스판 중에서 최소로 다시 칠해야 하는 정사각형의 수를 반환하는 함수입니다. 

728x90