https://www.acmicpc.net/problem/1018
#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 |