티스토리 뷰

PS

백준 1254. 팰린드롬 만들기

tose33 2021. 7. 30. 16:13

https://www.acmicpc.net/problem/1254

 

1254번: 팰린드롬 만들기

동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다. 동호는

www.acmicpc.net

 

 

이 문제는 처음에 주어진 문자열에 존재하는 알파벳들을 뒤에 일일히 붙여서 팰린드롬인지 판별하도록 짜다가

훨씬 좋은 방법이 있을것 같아서 찾아봤다.

 

먼저 팰린드롬이란 앞에서 읽으나 뒤에서 읽으나 같은 문자열이다.

그렇다면 팰린드롬이 아닌 주어진 문자열에서, 뒤에서부터 팰린드롬인 문자열을 찾으면 그 팰린드롬인 부분문자열을 제외한 나머지를 뒤에 붙이면 전체 문자열이 팰린드롬이 된다.

 

이렇게 말하니 햇갈리니 예를들자면 주어진 문자열이 abcc 라면 

앞에서부터 문자를 잘라본다:

abcc  // 팰린드롬이 아니다

bcc // 팰린드롬이 아니다  

cc   // 팰린드롬이다!

 

cc가 팰린드롬이므로 원래 문자열 abcc에 cc를 제외한 ab를 거꾸로 붙이면 abccba가 되고 팰린드롬이 된다.

그러나 문제에서는 길이만 구하면 되므로 실제로 뒤에 붙여볼 필요는 없고 크기만 계산하면 된다.

 

#include <iostream>
#include <string>

using namespace std;

string s;

// 팰린드롬인지 판별
bool IsItPalindrome(string str)
{
    int mid = str.size() / 2;

    for(int i = 0; i < mid; i++)
    {
        if(str[i] != str[str.size()-1-i])
            return false;
    }
    return true;
}

int main()
{
    cin >> s;

    // 문자열 s를 앞에서부터 잘라서 팰린드롬을 찾는다 
    for(int i = 0; i < s.size(); i++)
    {
        string temp = s.substr(i, s.size()-i);

        if(IsItPalindrome(temp))
        {
            cout <<  s.size() + i;
            return 0;
        }
    }
}

'PS' 카테고리의 다른 글

백준 2851. 슈퍼 마리오  (0) 2021.07.30
백준 1747. 소수&팰린드롬  (0) 2021.07.30
백준 17141. 연구소2  (0) 2021.07.29
백준 19532. 수학은 비대면강의입니다  (0) 2021.07.29
백준 15661. 링크와 스타트  (0) 2021.07.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함