코딩테스트_백준풀이
체스판 다시 칠하기 #1018번
wanna_dev
2023. 10. 3. 16:47
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함수 설정
정답이긴 하나, 더 좋은 방법이 있는지 토의 필요