백준 [17609] "회문"

Kimbab1004·2024년 8월 6일
0

Algorithm

목록 보기
63/102

처음에는 stack을 이용한 해결방법을 떠올리고 문제를 풀이했는데 다른 반례는 모두 맞았지만 xabba와 같이 마지막 스택에 값이 남고 이것이 다른 경우에 1을 출력하는게 되지 않았다.

정답을 찾아보니 투 포인터를 이용해 해결 할 수 있는 문제였고, 만약 투포인터를 떠올렸다면 쉽게 해결 할 수 있었을 것이다. 투 포인터를 이용할때 재귀 방식을 이용했는데 그 이유는 ababbabaa 와 같은 문제가 있을때 a와 b중 어떤 것을 제거했을때 맞는 방식인지 알 수 없기에 두가지 경우의 수를 모두 구해보기 위해서이다.

오답

#include <iostream>
#include <stack>

using namespace std;
int n;

stack<char> s;

//현재 입력받은 길이의 절반만큼 스택에 문자들을 넣고 절반이 지났을때 스택의 top들과 남은 문자들을 비교함 그런데 만약 현재 문자와 스택의 top이 다를경우 제외 할 수 있으면 제외하고
//진행하는데 스택의 값을 제외할지 남은 문자에서 제외할지는 다음 값들을 보고 해야할듯 그런데 다음 값들을 제외하더라도 맞지 않으면 그냥 2출력하고 break 
//그런데 제외하더라도 아니면 그냥 2출력 제외하고 되면 1출력 제외하지 않아도 되면 0
//abba
//summuus
//xabba
//xabbay
//comcom
//comwwmoc
//comwwtmoc
//
//0
//1
//1
//2
//2
//0
//1

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n;
	for (int i = 0; i < n; i++) {
		int flag = 0;
		string h;
		cin >> h;
		int k = h.length();
		int w;

		if (k % 2 == 0) {
			w = k / 2;
		}
		else {
			w = (k / 2)+1;
		}


		//문자열의 절반 만큼 넣기
		for (int j = 0; j < (k/2); j++) {
			s.push(h[j]);
		}
		for (int j = (k / 2); j < k; j++) {

			// 스택의 top과 남은 문자가 같을때 (0)
			if (s.top() == h[j]) {
				s.pop();
			}
			// 스택의 top과 남은 문자가 같지 않을때(1,2)
			else if (s.top() != h[j]) {
				//남은 문자열 중 제외하면 같은 경우 (1)
				if (j + 1 < k && s.top() == h[j+1]) {
					flag = 1;
					s.pop();
					j += 1;
				}
				else {
					// 스택의 최상위를 pop 해보고 그래도 아니면 양쪽 방법 모두 아니닌까 그냥 flag = 2로 하고 마무리
					s.pop();
					if (s.top() == h[j] || s.empty()) {
						flag = 1;
						s.pop();
					}
					else {
						flag = 2;
						break;
					}
				}
			}
		}
		if (flag == 1) {
			cout << 1 << "\n";
		}
		else if (flag == 2) {
			cout << 2 << "\n";
		}
		else if (flag == 0) {
			cout << 0 << "\n";
		}
	}
	
	return 0;
}

정답

#include <iostream>
#include <stack>

using namespace std;
int n;
string in;
int c = 3;

void pal(int s, int e, bool check) {
	while (s < e) {
		if (in[s] == in[e]) {
			s++;
			e--;
		}
		else {
			if (check == false) {
				pal(s, e - 1, true);
				pal(s + 1, e, true);
				return;
			}
			else {
				return;
			}
		}
	}
	c = check;

	return;
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> in;
		c = 2;
		pal(0, in.size() - 1, false);
		cout << c << "\n";
	}
	
	return 0;
}

0개의 댓글