Baekjoon Review
[Gold 5] 17609 회문
hanseongbugi
2024. 2. 26. 18:21
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
이 문제는 투 포인터를 사용해서 회문인지 유사 회문인지 검사하면 해결할 수 있다.
문제에서 주어지는 회문 검사는 algorithm에 있는 reverse 함수를 통해서도 검사할 수 있다.
reverse 함수에 의해 구할 수 있는 결과는 유사 회문은 검사할 수 없다.
따라서 회문인지 유사회문인지 그냥 문자열인지 한번에 판단하기 위해서 모든 검사를 투 포인터를 사용하는 것이 좋다.
회문인지는 0번째 인덱스(left)와 input.size() - 1번째 인덱스(right)에서 하나씩 검사하면 회문인지 판단 가능하다.
유사 회문인지는 left인덱스를 한칸 옮겨 검사한 결과와 right 인덱스를 한칸 옮겨 검사한 결과가 회문이면 유사 회문으로 판단할 수 있다.
유사 회문 검사를 시도 하였는데도 같은 문자가 발견되지 않는다면 그냥 문자열이 된다.
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int N;
string input;
int isPalindrome(int left, int right, bool reTest) {
while (left < right) {
if (input[left] != input[right]) {
if (reTest) {
if (isPalindrome(left + 1, right, false) == 0 || isPalindrome(left, right - 1, false) == 0)return 1;
}
return 2;
}
left++;
right--;
}
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> input;
cout << isPalindrome(0, input.size() - 1, true)<<'\n';
}
return 0;
}