니노니나니

[SWEA 1215] 회문1 - C++ 본문

알고리즘/삼성 Certi

[SWEA 1215] 회문1 - C++

SangJunni 2025. 2. 25. 22:30
 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제

"기러기", "토마토", "스위스"와 같이 똑바로 읽어도 거꾸로 읽어도 똑같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.
8x8 평면 글자판에서 제시된 길이를 가진 회문의 개수를 구하라.

위와 같은 글자판이 주어졌을 때, 길이가 5인 회문은 붉은색 테두리로 표시된 4개이므로 4를 반환하면 된다.

입력

총 10개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 찾아야 하는 회문의 길이가 주어지며, 다음 줄에 8x8 크기의 글자판이 주어진다.

풀이

#include<iostream>
#include<vector>
#include<string>
 
using namespace std;
 
int main(int argc, char** argv)
{
    int test_case;
    int T;
 
    //freopen("input.txt", "r", stdin);
 
    for (test_case = 1; test_case <= 10; ++test_case)
    {
        int length, count = 0;
        vector<string> data;
        cin >> length;
        for (int i = 0; i < 8; i++)
        {
            string line;
            cin >> line;
            data.push_back(line);
        }
        if (length == 1)
        {
            cout << "#" << test_case << " " << 64 << endl;
        }
        else
        {
            //가로 체크
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8 - length + 1; j++)
                {
                    bool ispalindrome = true;
                    for (int k = 0; k < length/2; k++)
                    {
                        if (data[i][j + k] != data[i][j + length - k - 1])
                        {
                            ispalindrome = false;
                        }
                    }
                    if (ispalindrome) count += 1;
                }
            }
            //세로 체크
            for (int i = 0; i < 8 - length + 1; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    bool ispalindrome = true;
                    for (int k = 0; k < length / 2; k++)
                    {
                        if (data[i+k][j] != data[i + length - k - 1][j])
                        {
                            ispalindrome = false;
                        }
                    }
                    if (ispalindrome) count += 1;
                }
            }
            cout << "#" << test_case << " " << count << endl;
        }
 
    }
    return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

해결방법

정형적인 회문 문제입니다. 다만, 빠르게 회문을 찾을 수있도록 길이의 절반을 기준으로 회문 여부를 확인하면 되는 문제입니다.

'알고리즘 > 삼성 Certi' 카테고리의 다른 글

[SWEA 1265] 달란트2 - C++  (0) 2025.02.25
[SWEA 1221] GNS - C++  (0) 2025.02.25
[SWEA 1213] String - C++  (0) 2025.02.25
[SWEA 1220] Magnetic - C++  (0) 2025.02.24
[SWEA 1245] 균형점 - C++  (0) 2025.02.24