1. 인덱스 연습하기 좋은 문제입니다. 2. 규칙을 찾아내고 그 규칙을 코딩으로 옮기는 연습입니다. |
/* 1817 시작합니다. 1215 회문 길이에 따른 회문의 개수를 구합니다. 그럼 짝수일때와 홀 수 일때를 나누어서 확인합니다. 1일때는 맵의 크기를 짝수일때는 길이의 반절만큼 비교해서 ans++ 홀수일때는 그것을 중심으로 양옆으로 비교해서 ans++ 을 하도록 합니다. */ #include <iostream> #include <algorithm> #include <string> using namespace std; #define SIZE 8 int map[SIZE][SIZE]; string str; int ans; int k; int isFine; void problemIn() { cin >> k; for (int i = 0; i < SIZE; i++) { cin >> str; for (int j = 0; j < SIZE; j++) { map[i][j] = str[j]; } } } /* 4/2 = 2 이므로 i는 그대로 쭉쭉 내려가면 되고, j */ void solve() { if (k == 1) { ans = 64; return; } // 짝수라면 if ((k % 2) == 0) { // 가로에 대해서 검사 for (int i = 0; i < SIZE; i++) { for (int j = (k / 2) - 1; j < SIZE - (k / 2); j++) { for (int l = 0; l < (k / 2); l++) { if (map[i][j - l] == map[i][j + 1 + l]) { isFine = 1; } else { isFine = 0; break; } } if (isFine) ans++; } } // 세로에 대해서 검사 for (int j = 0; j < SIZE; j++) { for (int i = (k / 2) - 1; i < SIZE - (k / 2); i++) { for (int l = 0; l < (k / 2); l++) { if (map[i - l][j] == map[i + 1 + l][j]) { isFine = 1; } else { isFine = 0; break; } } if (isFine) ans++; } } } // 홀수라면 else { for (int i = 0; i < SIZE; i++) { for (int j = (k / 2); j < SIZE - (k / 2); j++) { for (int l = 1; l <= (k / 2); l++) { if (map[i][j - l] == map[i][j + l]) { isFine = 1; } else { isFine = 0; break; } } if (isFine) ans++; } } for (int j = 0; j < SIZE; j++) { for (int i = (k / 2); i < SIZE - (k / 2); i++) { for (int l = 1; l <= (k / 2); l++) { if (map[i - l][j] == map[i + l][j]) { isFine = 1; } else { isFine = 0; break; } } if (isFine) ans++; } } } } int main() { for (int tc = 1; tc <= 10; tc++) { problemIn(); solve(); cout << "#" << tc << " " << ans << endl; ans = 0; } return 0; }
|