[SWEA] C++ 1215. [S/W 문제해결 기본] 3일차 - 회문1(D3)

swb·2022년 11월 14일
0

SWEA

목록 보기
2/19

문제 바로가기

접근방법

  1. 주어진 회문의 길이만큼 가로, 세로를 검사해야 한다.
  2. 세로는 가로의 인덱스를 반대로 설정하면 된다.
    ex) 가로 - arr[i][j], 세로 - arr[j][i]
  3. 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;
}
profile
개발 시작

0개의 댓글