[백준] 1018 체스판 다시 칠하기

Peace·2020년 12월 26일
0

백준 1018 체스판 다시 칠하기

문제

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

입력

출력

문제 해결 방법

문제를 브루트포스로 풀어보았다.
문제에서 나와있듯이 우리가 만들 체스판은 두가지 경우의 수만 존재한다.
8x8이고, 맨 왼쪽 위 칸이 흰색인 경우와 검은색인 경우이다.
나는 이 두 가지 경우를 미리 2차원 배열을 사용해 만들어 놓고, 입력 받은 보드를 위에서 부터 아래와 오른쪽으로 차례로 8x8칸으로 잘라서 만들어 놓은 체스판과 비교하여, 최소값을 찾았다.

코드 구현(c++)

#include <iostream>
#include <string>

using namespace std;


string black[8] = {
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB"
};
string white[8] = {
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW"
};
string chess[50];
int black_check(int x,int y){
    int diff = 0;
    for(int i = x; i < x + 8; i++){
        for(int j = y; j < y + 8; j++){
            if(chess[i][j] != black[i-x][j-y]) diff++;
        }
    }
    return diff;
}
int white_check(int x,int y){
    int diff = 0;
    for(int i = x; i < x + 8; i++){
        for(int j = y; j < y + 8; j++){
            if(chess[i][j] != white[i-x][j-y]) diff++;
        }
    }
    return diff;
}
int main(){
    int min = 1000000;
    int row,col;
    scanf("%d %d",&row,&col);
    for(int i = 0; i < row; i++){
        cin >>chess[i];
    }
    for(int i = 0; i <= row - 8; i++){
        for(int j = 0; j <= col - 8; j++){
            int black_num = black_check(i,j);
            int white_num = white_check(i,j);
            if(min > black_num) min = black_num;
            if(min > white_num) min = white_num; 
        }
    }
    printf("%d\n",min);
}

평가

문제에 대한 정확한 이해없이 바로 입력과 출력과 예제만 보고, 바로 푸는 습관이 있는데 이것이 오히려 쉬운 문제에 시간을 오래 쏟게 만드는 것 같다. 앞으로 문제에 대한 충분한 이해를 하고 알고리즘을 짜고, 코드를 구현하는 습관을 들여야겠다. 이번에는 코드를 나름 이쁘게 짠거 같아 기분이 좋다.
최대한 main에는 간단한 것들만, 그리고 한 function에는 한 가지 기능만 구현하도록 노력해야겠다.
입력받는 것도 cin으로 하던지, scanf로 하던지 통일을 해야겠다.

profile
https://peace-log.tistory.com 로 이사 중

0개의 댓글

관련 채용 정보