본문 바로가기
코딩테스트_백준풀이

체스판 다시 칠하기 #1018번

by wanna_dev 2023. 10. 3.

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

#include<iostream>

using namespace std;
char board[51][51];

char ans_white[8][8] = {
    {'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 ans_black[8][8] = {
  {'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'},
};

int check(int a, int b) { //check함수는 바꿔야하는 개수 반환
    int count1 = 0;
    int count2 = 0;
    
    
        for (int i = a; i < a + 8; i++) {
            for (int j = b; j < b + 8; j++) {
                if (board[i][j] != ans_white[i-a][j-b])
                    count1++;
            }
        }

   
  
        for (int i = a; i < a + 8; i++) {
            for (int j = b; j < b + 8; j++) {
                if (board[i][j] != ans_black[i-a][j-b])
                    count2++;
            }
        }
    
    if (count1 > count2)return count2;
    else return count1;
    

}
int main() {
    int N, M;
    int min = 987654321;

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

    //i, j는 시작 인덱스
    for (int i = 0; i < N - 7; i++) {
        for (int j = 0; j < M - 7; j++) {
            if (min > check(i, j)) {
                min = check(i, j);
            }
        }
    }
    cout << min << endl;
    return 0;
}

처음 문제를 생각했던 방법 : 

순회하면서 내가 만든 W로 시작하거나 B로 시작하는 정답지와 비교해서 틀린것의 개수중 최소를 찾아서 보이면 되지 않을까?

 

도중 마주한 문제 : 

예제 입력 4 의 테스트케이스에서 31이 아닌 32가 출력되었다.

 

고민의 결과 : 

처음이 뭐로 시작하는지로만 순회 하였기 때문이었고, 결국 2배 느리지만 ans_black 과 ans_white를 둘다 검사하여 최소값을 리턴하도록 check함수 설정

 

정답이긴 하나, 더 좋은 방법이 있는지 토의 필요

'코딩테스트_백준풀이' 카테고리의 다른 글

팩토리얼 0의 개수 #1676 c++ 풀이  (0) 2023.10.05
영화감독 숌 #1436 c++ 풀이  (0) 2023.10.04
단어정렬 #1181 c++ 풀이  (1) 2023.10.03
팰린드롬수 #1259 c++ 풀이  (0) 2023.10.03
C++ 2563 색종이  (0) 2023.07.12