문제 풀이/프로그래머스
프로그래머스 - 가장 긴 팰린드롬 [C++]
JJJaewon
2023. 8. 17. 20:19
반응형
이 문제는 완전 탐색과 투 포인터를 이용한 문제이다. 일단 문자열의 최대 길이가 2500이므로, O(n^2) = 6,250,000 이 되므로 1초 안에는 가능하다. 내가 처음 생각한 알고리즘은 모든 부분 문자열에 대해서 팰린드롬인지 아닌지를 판단하고, 만약 팰린드롬이면 answer를 갱신하는 방식이었다. 거의 다 잘 작동했지만, 문제는 효율성 검사 2 에서 시간 초과가 발생한다는 것이었다.
시간 초과를 줄이기 위해서 cnt에 대한 루프를 주어진 문자열 길이부터 1까지로 줄여나가는 방향으로 하고, 만약 답을 찾으면 그 즉시 리턴하는 것이다. 약간 그리디한 방식인데, 결국 문제에서 찾아야 하는건 가장 긴 팰린드롬이므로 바로 리턴하는 것이 최적해를 낼 수 있다.
여기서 주의할 점은 길이가 1인 문자열은 당연히 팰린드롬이라는 것이다. 또한 부분 문자열의 길이가 홀수냐 짝수냐에 대해 헷갈릴 수 있는데, left와 right가 같을 때에도 비교를 해주고, while의 조건식을 left <= right 로 놓으면 홀짝을 고려하지 않고도 간단히 문제를 풀 수 있다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int palindrome(string& s, int start, int end) {
int left = start;
int right = end - 1;
while (left <= right) {
if (s[left] == s[right]) {
left++;
right--;
}
else {
return -1;
}
}
return end - start;
}
int solution(string s) {
int answer = 0;
for (int cnt = s.size(); cnt >= 1; cnt--) {
int last = s.size() - cnt;
for (int i = 0; i <= last; i++) {
int start = i;
int end = i + cnt;
int result = palindrome(s, start, end);
if (result != -1) {
return result;
}
}
}
return answer;
}
반응형