알고리즘 공부 및 문제 풀이/백준(BOJ)
[c++] 백준 1254 팰린드롬 만들기 - 투포인터
yoonjiy
2022. 1. 28. 22:40
[문제]
https://www.acmicpc.net/problem/1254
1254번: 팰린드롬 만들기
동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다. 동호는
www.acmicpc.net
[풀이]
문제를 잘 읽자....문자열 뒤에만 추가할 수 있단다. 그걸 못보고 insert로 중간 삽입해서 풀다가 왜 계속 틀리는 거지??? 멘붕 왔는데...뻘짓했다...
먼저 맨 처음 문자부터 맨 마지막까지 팰린드롬이 되는지를 확인하고 팰린드롬이 되는 첫번째 인덱스를 찾는다. 그럼 전체 문자열 길이+팰린드롬이 되는 첫번째 인덱스 값이 답이 된다.
예를 들어, aabcaa의 경우 마지막 aa만 팰린드롬이 되므로 팰린드롬이 되는 첫번째 인덱스는 4이다. 즉 6+4가 최소 길이이고 aabc aa + cbaa 가 될 것이다. aabcba의 경우 맨 앞에 a를 제외한 abcba가 팰린드롬이다. 따라서 마지막에 a만 추가하면 a abcba + a로 가장 최소길이의 팰린드롬이 된다. 이는 팰린드롬이 되는 첫번째 인덱스가 두번째 a값, 즉 1이므로 6+1인 7이 최소길이이다.
[코드]
#include <iostream>
#include <string>
using namespace::std;
string s;
bool isPalindrome(int start, int end, string s){
while(start<=end){
if(s[start]==s[end]){
start += 1;
end -= 1;
}
else{
return false;
}
}
return true;
}
int main() {
//만들 수 있는 가장 짧은 팰린드롬의 길이를 출력
cin >> s;
//aabc aa + cbaa
//a abcba + a
//특정 인덱스부터 문자열의 맨 마지막까지 팰린드롬이 되는 문자열의 시작 위치를 찾음.
int end = s.length()-1;
for(int i=0; i<=end; i++){
if (isPalindrome(i, end, s)){
cout << s.length()+i;
return 0;
}
}
}