문제 바로가기
접근방법
- 주어진 회문의 길이만큼 가로, 세로를 검사해야 한다.
- 세로는 가로의 인덱스를 반대로 설정하면 된다.
ex) 가로 - arr[i][j], 세로 - arr[j][i]
- CBBCBAAB가 있다고 치자. 다음과 같은 순서로 검사를 해야 한다.
- 1) CBBC
- 2) BBCB
- 3) BCBA
- 4) CBAA
- 5) BAAB
만약 회문의 길이가 4라면 반복은 5번해야 한다.
즉, 8 - 회문의길이 + 1만큼의 반복을 한 줄당 하는 것이다.
슈도코드
2차원 배열 입력
for: // 8줄을 도는 반복문(위에서 부터 아래로)
for: // 한 줄당 반복하는(8-회문의 길이만큼)
for: // 회문을 체크하는(회문의길이만큼) 가로
if arr[고정][시작, 증가] != arr[고정][끝, 감소]
flag = false
if flag cnt++
flag = true
for: // 회문을 체크하는(회문의길이만큼) 세로
if arr[시작, 증가][고정] != arr[끝, 감소][고정]
flag = false
if flag cnt++
풀이
#include <iostream>
#include <string>
#define RULE 8
using namespace std;
int test_case = 10, searchLen;
string str;
string map[RULE];
void inputMap() {
for (int j = 0; j < RULE; j++) {
cin >> str;
map[j] = str;
}
}
int palindrome() {
bool flag;
int answer = 0;
for (int j = 0; j < RULE; j++) {
for (int l = 0; l <= RULE - searchLen; l++) {
flag = true;
for (int k = l; k < l + searchLen / 2; k++) {
if (map[j][k] != map[j][(l + l) + searchLen - k - 1]) {
flag = false;
}
}
if (flag)
answer++;
flag = true;
for (int k = l; k < l + searchLen / 2; k++) {
if (map[k][j] != map[(l + l) + searchLen - k - 1][j])
flag = false;
}
if (flag)
answer++;
}
}
return answer;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 1; i <= test_case; i++) {
cin >> searchLen;
inputMap();
cout << "#" << i << " " << palindrome() << "\n";
}
return 0;
}