백준 17609번 - 회문

박진형·2021년 7월 26일
0

algorithm

목록 보기
44/111

문제 풀이

l과 r을 지정해서 경우에 따라 조정해가면서 문제를 풀어나간다.
s[l]과 s[r]이 다를 경우에는 왼쪽, 오른쪽 각각 하나씩 제거 해보면서 팰린드롬이 되는지 확인을 한다.
s[l]과 s[r]이 다를 경우에 각각 제거해서 확인한 후 cnt가 여전히 0이면 유사회문도 되지 않는 것이므로 2를 출력하고
cnt값이 2이상으로 쌓이면 그것또한 회문, 유사회문 둘다 되지 않으므로 2를 출력한다.
나머지는 cnt값에 따라 출력해주면 된다.

문제 링크

boj/17609

소스코드

PS/17609.cpp

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<map>
#include<memory.h>
#include<queue>
using namespace std;
bool isPalin(string s, int,int);
int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T;
	cin >> T;
	while (T--)
	{
		string s;
		cin >> s;
		int l = 0, r = s.size() - 1;
		int cnt = 0;
		bool flag = false;
		while (l <= r)
		{
			if (s[l] != s[r])
			{
				if (isPalin(s, l+1,r))
				{
					l++;
					cnt++;
				}
				else if (isPalin(s, l,r-1))
				{
					r--;
					cnt++;
				}
				if (cnt == 0)
				{
					cout << "2\n";
					flag = true;
					break;
				}
			}
			else
			{
				l++;
				r--;
			}
			if (cnt >= 2)
			{
				cout << "2\n";
				break;
			}
		}
		if (flag)
			continue;
		if (cnt == 1)
			cout << "1\n";
		else if(cnt== 0)
			cout << "0\n";
	}
}

bool isPalin(string s, int l, int r)
{
	while (l < r)
	{
		if (s[l] != s[r])
			return false;
		l++;
		r--;
	}
	return true;
}

0개의 댓글