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
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 1652번: 누울 자리를 찾아라 (0) | 2022.07.23 |
---|---|
[백준/c++] 16439번: 치킨치킨치킨 (0) | 2022.07.22 |
[백준/c++] 17413번: 단어 뒤집기 2 (0) | 2022.07.19 |
[백준/c++] 16171번: 나는 친구가 적다(Small) (0) | 2022.07.18 |
[백준/c++] 4659번: 비밀번호 발음하기 (0) | 2022.07.18 |