문제

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


리뷰

주어진 체스판을 WBWB 패턴의 8 x 8 크기의 체스판, 또는 BWBW 패턴으로 바꾸려고 한다.

이미 목표한 2종류 패턴의 체스판을 string 배열로 만들어 둔다.

string B[51];   // 보드  ( 가로 세로는 최대 50보다 작거나 같다.)

string W_pattern[8] = {
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"}
}; 

string B_pattern[8] = {
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"}
}; 

주어진 보드의 시작점을 달리하면서

시작점에서 W_pattern이랑 다른 칸의 개수를 세고, B_pattern이랑 다른 칸의 개수를 센다.

    for(int i = 0; i+7 < N; i++){
        for(int j = 0; j+7 < M; j++){
            min_cnt = min(min_cnt, Bcheck(i, j) );
            min_cnt = min(min_cnt, Wcheck(i, j) );
        }
    } 

맞은 코드

#include <iostream>
#include <string> 
#include <algorithm> 
using namespace std;

int N, M;         // 세로, 가로  
string B[51];   // 보드  
int min_cnt = 2e9;

string W_pattern[8] = {
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"}
}; 

string B_pattern[8] = {
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"},
    {"BWBWBWBW"},
    {"WBWBWBWB"}
}; 

int Wcheck(int x, int y){

    int n_limit = x+8;
    int m_limit = y+8;
    int cnt = 0;

    for(int i = x; i < n_limit; i++){
        for(int j = y; j < m_limit; j++){
            if(B[i][j] != W_pattern[i-x][j-y] ) cnt++;
        }
    }
    return cnt; 
}


int Bcheck(int x, int y){

    int n_limit = x+8;
    int m_limit = y+8;
    int cnt = 0;

    for(int i = x; i < n_limit; i++){
        for(int j = y; j < m_limit; j++){
            if(B[i][j] != B_pattern[i-x][j-y] ) cnt++;
        }
    }
    return cnt; 
}


int main(void){

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

     for(int i = 0; i < N; i++){
         cin >> B[i];
    }

    for(int i = 0; i+7 < N; i++){
        for(int j = 0; j+7 < M; j++){
            min_cnt = min(min_cnt, Bcheck(i, j) );
            min_cnt = min(min_cnt, Wcheck(i, j) );
        }
    } 

    printf("%d", min_cnt);

    return 0;
} 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

수 정렬하기3 백준 10989번  (0) 2020.10.02
팰린드롬수 백준 1259번  (0) 2020.10.02
골드바흐 파티션 백준 17103번  (0) 2020.10.02
요세푸스 문제 0 백준 11866  (0) 2020.10.02
카드2 백준 2164번  (0) 2020.09.30

+ Recent posts