본문 바로가기
문제풀이/백준

BOJ1018 체스판 다시 칠하기 C++

by 맑은청이 2020. 6. 21.
728x90
반응형

사용언어

C++

문제

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8*8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

입력

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

출력

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


예제 입력 1

 


예제 출력 1

1


 

 

문제 풀이

// BOJ1018.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
/*
전체를 담을 배열 
8x8을 담을 임시 배열
첫번째 칸이 검은색/흰색
최소 저장할 변수 선언
8x8 체스판 선정
*/

#include <iostream>
#define LEN 8
#define MAX 50

using namespace std;

int M, N;
int minNum = 1000;
//검은색 체스판
char check1[LEN+1][LEN+1] = {
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
};
//흰색 체스판
char check2[LEN+1][LEN+1] = {
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
    {'B','W','B','W','B','W','B','W'},
    {'W','B','W','B','W','B','W','B'},
};
char myCheck[MAX+1][MAX+1];
//입력 받은 체스판

//최소값구하기
void checkMin(int row,int col) {
    int temp1 = 0;
    int temp2 = 0;
    int minTemp;
    for (int i = row,n =0; i < row + LEN; i++,n++) {
        for (int j = col,m =0; j < col + LEN; j++,m++) {
            if (myCheck[i][j] != check1[n][m]) temp1++;
            if (myCheck[i][j] != check2[n][m]) temp2++;
        }
    }
    
    minTemp = (temp1 < temp2) ? temp1 : temp2;
    if (minTemp < minNum) minNum = minTemp;
}

 int main()
{
     //입력 받기
     cin >> M >> N;
     for (int i = 0; i < M; i++)
         for (int j = 0; j < N; j++)
             cin >> myCheck[i][j];
    
    //최소 값 반환 함수 

     for (int i = 0; i <= M - 8; i++) {
        for (int j = 0; j <= N - 8; j++) {
            checkMin(i, j);
        }
    }
     printf("%d", minNum);
     //for (int i = 0; i < M; i++) {
     //    for (int j = 0; j < N; j++) {
     //        cout << myCheck[i][j];
     //    }
     //    cout << endl;
     //}
            
 }

// 프로그램 실행: <Ctrl+F5> 또는 [디버그] > [디버깅하지 않고 시작] 메뉴
// 프로그램 디버그: <F5> 키 또는 [디버그] > [디버깅 시작] 메뉴

// 시작을 위한 팁: 
//   1. [솔루션 탐색기] 창을 사용하여 파일을 추가/관리합니다.  //   2. [팀 탐색기] 창을 사용하여 소스 제어에 연결합니다.
//   3. [출력] 창을 사용하여 빌드 출력 및 기타 메시지를 확인합니다.
//   4. [오류 목록] 창을 사용하여 오류를 봅니다.
//   5. [프로젝트] > [새 항목 추가]로 이동하여 새 코드 파일을 만들거나, [프로젝트] > [기존 항목 추가]로 이동하여 기존 코드 파일을 프로젝트에 추가합니다.
//   6. 나중에 이 프로젝트를 다시 열려면 [파일] > [열기] > [프로젝트]로 이동하고 .sln 파일을 선택합니다.

 

처음에는 컴파일 에러가 나오길래 뭔가 했더니 변수 이름을 min 으로 잡아서 그렇더군요.

알고리즘 분류

브루트 포스

 

출처 :  https://www.acmicpc.net/problem1081

 

728x90
반응형

'문제풀이 > 백준' 카테고리의 다른 글

BOJ1931 회의실 배정  (0) 2020.08.06
BOJ11650 좌표정렬2 C++  (0) 2020.06.20
BOJ2231 분해합  (0) 2020.06.18
BOJ2798 블랙잭  (0) 2020.06.16
BOJ10872  (0) 2020.06.05