본문 바로가기
알고리즘/백준 문제

17609 - 회문

by HDobby 2023. 7. 16.

https://www.acmicpc.net/problem/17609

 

17609번: 회문

각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

www.acmicpc.net

과정

1. 탈출은 회문이 아님이 결정나거나, l과 r이 역전될 경우 탈출한다.

2. input[l]과 input[r]이 같은 경우 다음 칸 확인으로 넘어간다.

3. 왼쪽 칸을 옮긴 경우, 오른쪽 칸을 옮긴 경우를 둘 다 확인한다.

코드

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int T;
string input;

int dfs(int l, int r, int cnt){
    if(l>r || cnt == 2)
        return cnt;

    if(input[l] == input[r]){
        return dfs(l+1,r-1,cnt);
    }

    else{
        int lcnt = cnt+1, rcnt = cnt+1;
        if(input[l+1] == input[r])
            lcnt = dfs(l+1,r,cnt+1);
        else
            lcnt = 2;
        
        if(input[l] == input[r-1])
            rcnt = dfs(l, r-1, cnt+1);
        else
            rcnt = 2;

        return min(lcnt, rcnt);
    }
}

void solution(){
    cin>>T;
    while(T--){
        cin>>input;

        cout<<dfs(0, input.length() - 1, 0)<<'\n';
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

20922 - 겹치는 건 싫어  (0) 2023.07.17
14940 - 쉬운 최단거리  (0) 2023.07.17
16401 - 과자 나눠주기  (0) 2023.07.15
22682 - 가장 긴 짝수 연속한 부분 수열 (large)  (0) 2023.07.15
17266 - 어두운 굴다리  (0) 2023.07.15

댓글