[PS 백준 - 2.5] 1018번: 체스판 다시 칠하기

PongkiJoa·2021년 6월 30일
0

PS Diary - 백준

목록 보기
18/54
post-thumbnail

문제 정보

백준 1018번 - 바로가기

  • 난이도: 실버 5
  • 알고리즘: 브루트포스 알고리즘

코멘트

8×88\times8 크기의 네모판으로 모든 체스판을 잘라내서, 지그재그로 'W'와 'B'의 개수를 센 다음 이 값들 중 최솟값을 고르면 된다.
지그재그로 개수를 세는 함수는 checkNum() 함수로 다음과 같다.

int checkNum(char arr[][8]) {
    int count = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if ((i + j) % 2 == 0) {
                if (arr[i][j] != 'W') count++;
            }
            else {
                if (arr[i][j] != 'B') count++;
            }
        }
    }
    return count;
}

소스 코드

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int checkNum(char arr[][8]) {
    int count = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if ((i + j) % 2 == 0) {
                if (arr[i][j] != 'W') count++;
            }
            else {
                if (arr[i][j] != 'B') count++;
            }
        }
    }
    return count;
}

int main() {
    ios::sync_with_stdio(false); 
    cin.tie(0); 
    cout.tie(0);
    
    int m, n;
    cin >> n >> m;
    char c;
    char** arr = new char* [n];
    for (int i = 0; i < n; i++) {
        arr[i] = new char[m];
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> c;
            arr[i][j] = c;
        }
    }
    int min = 64;
    int max = 0;

    for (int i = 0; i < n-7; i++) {
        for (int j = 0; j < m-7; j++) {
            char temp[8][8];

            for (int a = 0; a < 8; a++) {
                for (int b = 0; b < 8; b++) {
                    temp[a][b] = arr[a + i][b + j];
                }
            }

            int num = checkNum(temp);

            min = min < num ? min : num;
            max = max > num ? max : num;
        }
    }

    cout <<( min > 64 - max ? 64 - max : min);

    for (int i = 0; i < n; i++) {
        delete[] arr[i];
    }
    delete[] arr;
}
profile
컴공 20학번

0개의 댓글

관련 채용 정보