1018: 체스판 다시 칠하기

2022. 5. 1. 00:32C언어/백준

-Class2: Silver 5

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

-결과

 

-코드

#include <stdio.h>

int main(){
    int row, col; //체스판의 가로, 세로
    char array[50][50];
    int min = 32; 
    
    scanf("%d %d", &row, &col);
    
    for(int i = 0; i < row; i++){
        scanf("%s", array[i]);
    }
    
    for(int i = 0; i < row - 7; i++){ //세로 범위
        for(int j = 0; j < col - 7; j++){ //가로 범위
            int count = 0;
            for(int s_i = i; s_i < i + 8; s_i++){
                for(int s_j = j; s_j < j + 8; s_j++){
                    count += (s_i + s_j) % 2 == 1 ^ array[s_i][s_j] == 'B'; 
                }
            }
            count = 64 - count < count ? 64 - count : count;
            min = count < min ? count : min;
        }
    }
    
    printf("%d\n", min);
    return 0;
}

 

-풀이

M*N 크기의 체스판을 모두 돌면서 다시 칠해야 하는 정사각형의 수가 최소인 경우를 찾는 문제이다.

맨 왼쪽 위칸을 흰색으로 가정하고 계산하면, 0,0은 흰색, 0,1은 검정색, 1,0은 검정색, 1,1은 흰색이 된다. 즉, 가로 세로 인덱스의 합이 짝수이면 흰색, 홀수이면 검정색이 들어간다. 따라서 합과 들어있는 색이 잘못된 경우를 카운트하면 다시 칠해야 하는 칸의 개수가 나온다. 이 계산을 반복하고 그 중 최소값을 구하여 출력하면 된다.

'C언어 > 백준' 카테고리의 다른 글

1436: 영화감독 숌  (0) 2022.05.01
1181: 단어 정렬  (0) 2022.05.01
10773: 제로  (0) 2022.04.03
9012: 괄호  (0) 2022.04.03
1094번: 막대기  (0) 2022.04.03