본문 바로가기
Programming/Algorithm

swe 1215 회문1

by OKOK 2018. 3. 28.

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;

}