#include <iostream>
using namespace std;
int main() {
int row, col;
cin >> row >> col;
char color[50][50];
char arr1[8][8];
char arr2[8][8];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cin >> color[i][j];
if (i < 8 && j < 8) {
if (i % 2 == 0) {
if (j % 2 == 0) {
arr1[i][j] = 'B'; // 젤왼쪽위 B
arr2[i][j] = 'W'; // 젤왼쪽위 W
}
else {
arr1[i][j] = 'W';
arr2[i][j] = 'B';
}
}
else {
if (j % 2 == 0) {
arr1[i][j] = 'W';
arr2[i][j] = 'B';
}
else {
arr1[i][j] = 'B';
arr2[i][j] = 'W';
}
}
}
}
}
int n = 0, m = 0;
int count1 = 0;
int count2 = 0;
int min1 = 64, min2 = 64;
for (n = 0; n <= row - 8; n++) {
for (m = 0; m <= col - 8; m++) {
count1 = 0;
count2 = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (color[i + n][j + m] != arr1[i][j])
count1++;
else if (color[i + n][j + m] != arr2[i][j])
count2++;
}
}
if (min1 > count1)
min1 = count1;
if (min2 > count2)
min2 = count2;
}
}
if (min1 > min2)
cout << min2;
else
cout << min1;
}
우선, 입력받은 크기만큼 사용자에게 색상을 입력하도록함과 동시에 비교할 샘플 arr 를 입력한다. 두 arr가 존재하는데 하나는 제일 왼쪽 위가 B인것, 하나는 제일 왼쪽위가 W인것이다. 각 arr의 크기는 8*8이다.
사용자가 입력한 배열중 [0][0]부터 시작하여 8*8 크기만큼을 두개의 arr와 비교하여 바꿔야할 부분을 count한다.
arr1 와 arr2일때의 count를 비교한 후 더 작은 count를 출력하도록 한다.
처음에는 666, 1666, 2666, 3666, 4666, 5666, 6666,7666 ... 이런식으로 올라가는 줄 알고 너무 쉬운데..?! 뭔가 이상하다 생각했는데
알고보니 666이 포함되는 숫자들이면 모두 가능한 것이다. 즉 6660, 6661, 6662 등도 포함해주어야 하는 것이다.
따라서 665부터 1씩증가시키며 모든 숫자를 비교하고, 이 숫자를 string으로 바꾸어 666이 포함되는 지를 find로 찾아내 만약 포함된다면 count를 올려준다. 처음입력한 N번째 와 count가 같은 수가 되면 숫자를 출력한다.
#include <iostream>
#include <string>
using namespace std;
int main() {
int N;
cin >> N;
int num = 665;
string s;
int count = 0;
while (true) {
num++;
s = to_string(num);
if (s.find("666") != -1)
count++;
if (count == N) {
cout << num;
break;
}
}
}