알고리즘/백준
[백준/c++] 17609번: 회문
녕이
2022. 7. 19. 11:23
728x90
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
골머리 앓았던 문제..
모든 조건을 챙기려다 보니까 끝이 없었다... 그래서 다시 생각해보고 앞 혹은 뒷 문자를 정말 지우는 방법을 써봤다.
string에는 erase라는 함수가 있는데 이를 사용했다. 이 문제는 두 포인터를 사용하면 되는데, 앞 뒤 인덱스를 가리키는 l, r 포인터를 만들고 해당 문자들이 동일한지 체크하면 된다.
팰린드롬인지 아닌지 확인하는 checkP함수 (동일하지 않다면 바로 false 반환, 같으면 l++, r--으로 다른 문자 확인)
ccheck 함수는 앞 뒤 문자를 지우고 checkP함수에 가서 팰린드롬인지 확인하도록 구현했다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool checkP(string s){
int l = 0, r = s.size()-1;
while(l<r){
if(s[l] != s[r]) return false;
else{
l++; r--;
}
}
return true;
}
void ccheck(string s){
int l = 0, r = s.size() - 1;
while(l<r){
if(s[l] != s[r]){
string ori = s;
string t1 = s.erase(l, 1); //l기준 앞부분 한 글자 삭제
string t2 = ori.erase(r, 1); //r기준 뒷부분 한 글자 삭제
if(checkP(t1) || checkP(t2)) cout << 1 << '\n';
else cout << 2 << '\n'; //l, r 둘다 지워봤는데 같지 않으면 2 출력
return;
}else{
r--; l++;
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t;
cin >> t;
while(t--){
string s;
cin >> s;
if(checkP(s)) cout << 0 << '\n';
else ccheck(s);
}
return 0;
}
728x90