✨컴공주✨ [1052682] · MS 2021 · 쪽지

2024-08-13 00:27:49
조회수 1,297

컴공일기 247

게시글 주소: https://spica.orbi.kr/00068916354



회문(Palindrome).


우영우 기러기 12321과 같이 대칭적인 문자열을 일컫는데, 

주어진 문자열에서 범위를 설정하고, 그 범위 내 부분문자열이 회문인지를 검사하는 알고리즘입니다.


우선 완전 탐색을 해야하는 상황이고, 전체 SIZE가 2000 정도로 시간복잡도에 대한 부담감이 없는 상황이네요.


 또한 회문 알고리즘의 특성 상 점화 관계를 이용해야 하기 때문에 Dynamic Programming 기법으로 구하는 것이 합당하다고 보여집니다.


아래는 C++로 구현한 코드입니다. 정답이네요.


오랜만에 왔는데, 방금 푼 코드나 올리고 도망가겠습니다. 안녕히 주무십쇼.


#include <iostream>

#define SIZE 2001


using namespace std;


int isPalindrome[SIZE][SIZE];

int arr[SIZE];

int N; //수열의 크기

int M; //질의 개수


int main()

{

    ios::sync_with_stdio(false);

    cin.tie(0);

    cout.tie(0);


    cin >> N;

    

    // 편의상 index는 1부터 시작

    for(int i = 1; i <= N; i++)

    {

        cin >> arr[i];

    }


    // 길이 1인 부분 수열은 항상 회문

    for(int i = 1; i <= N; i++)

    {

        isPalindrome[i][i] = 1;

    }


    // 길이 2인 부분 수열 판단

    for(int i = 1; i <= N - 1; i++)

    {

        if(arr[i] == arr[i + 1])

        {

            isPalindrome[i][i + 1] = 1;

        }

    }


    // 길이 3 이상인 부분 수열에 대한 회문 판단

    for(int length = 3; length <= N; length++) // 부분 수열의 길이

    {

        for(int i = 1; i <= N - length + 1; i++) // 시작 인덱스

        {

            int j = i + length - 1; // 종료 인덱스

            if(arr[i] == arr[j] && isPalindrome[i + 1][j - 1] == 1)

            {

                isPalindrome[i][j] = 1;

            }

        }

    }


    // 질의 처리

    cin >> M;


    for(int i = 0; i < M; i++)

    {

        int S, E;

        cin >> S >> E;

        cout << isPalindrome[S][E] << "\n";

    }


    return 0;

}

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.