알고리즘/백준

[백준/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