본문 바로가기
Programming/BOJ

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

by 작은별하나 2019. 12. 24.
반응형

블랙과 화이트가 일정규칙이 아닌 체스 보드가 있습니다.  체스판은 블랙과 화이트가 교차되어 나열되어있고, 세로방향도 마찬가지입니다.  총 8칸, 8열이 있어서, 32칸의 블랙칸과 32칸의 화이트칸이 서로 같은색끼리는 인접하지 않고 있습니다.  이번 문제는 블랙과 화이트가 엉망인 체스 보드에 칠을 최소한으로 칠하고자 할 때, 칠한 횟수를 구하는 것입니다.

 

체스판 다시 칠하기

더구나 이 체스 보드는 8x8 보다 클 수도 있어서, 칠하는 횟수를 적게할 수 있도록 8x8 구역도 정해야 합니다.

 

백준 사이트의 문제는 아래의 링크에 있습니다.

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

가장 무식한 방법으로는, 8x8판의 모든 색을 검사하여 최소비용의 칠 횟수를 구하는 것입니다.  8x8인 판이라면 총 64번의 검사비용이 필요하겠지만, 15x15 인 체스 보드라면 총 4,096번의 검사 비용이 듭니다.  문제의 범위대로 50x50 이라면, 78,400번의 검사 비용이 듭니다.

 

사실 뭐 이정도면, 단순 무식하게 처리해도 됩니다.  이 문제는 시간초과로 질문 올리신 분도 없고 맞은 분들은 대부분 0ms 이내에서 처리했습니다.  문제의 유형에서 봐도 브루트포스 방식이 나와있습니다.  한쪽 방향이면 어떻게든 효율좋게 짜볼텐데요.

 

아래는 제가 작성한 소스입니다.  참고용으로만 봐주세요.

//------------------------------------------------------------------------------
//  baekjoon #1018 - Paint Chess Board Again.
//    - by Aubrey Choi
//    - created at 2019-06-13
//------------------------------------------------------------------------------
#include <stdio.h>

int count(char board[][50], int x, int y)
{
  int miss = 0;
  for(int i = y; i < y+8; i++)
  {
    for(int j = x; j < x+8; j++)
    {
      if(board[i][j] ^ ((i+j)%2)) miss++;
    }
  }
  return miss >= 32 ? 64-miss : miss;
}

int main()
{
  int m, n;
  char board[50][50];
  scanf("%d%d", &n, &m);
  for(int i = 0; i < n; i++)
  {
    char str[100];
    scanf("%s", str);
    for(int j = 0; j < m; j++)
    {
      board[i][j] = (str[j] == 'B');
    }
  }
  int min = 32;
  for(int i = 0; i <= n - 8; i++)
  {
    for(int j = 0; j <= m - 8; j++)
    {
      int s = count(board, j, i);
      if(min > s) min = s;
    }
  }
  printf("%d\n", min);
  return 0;
}

728x90

'Programming > BOJ' 카테고리의 다른 글

백준 #1021 회전하는 큐  (3) 2019.12.25
백준 #1019 책 페이지  (0) 2019.12.25
#1017 소수쌍(네트워크 플로우)  (0) 2019.12.24
백준 #1016 제곱 ㄴㄴ수  (0) 2019.12.24
백준 #1015 수열 정렬  (0) 2019.12.23

댓글