[문제 링크]

 

10942번: 팰린드롬?

총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.

www.acmicpc.net


팰린드롬인 경우는 다음과 같다.

if(S == E) 일 경우 길이가 1이므로 무조건 팰린드롬,

else if(S+1 == E && arr[S] == arr[E]) 일 경우 길이가 2며 양쪽 끝이 서로 같으므로 팰린드롬,

else if(arr[start] == arr[end] && memo[start+1][end-1] == 1) 일 경우 즉, 양쪽 끝의 숫자가 같고, 양쪽 숫자를 제외한 나머지 부분이 팰린드롬일 경우 팰린드롬이다.


#include <iostream>
#include <cstring>
using namespace std;

int arr[2001], memo[2001][2001];

int Topdown(int start, int end)
{
	if (start == end) return 1;
	if (start + 1 == end) return arr[start] == arr[end] ? 1 : 0;

	int& ret = memo[start][end];
	if (ret != -1) return ret;

	if (arr[start] == arr[end] && Topdown(start + 1, end - 1))
		return ret = 1;
	else
		return ret = 0;
}

void Bottomup(int N)
{
	for (int i = 1; i <= N; i++)
		memo[i][i] = 1;

	for(int end = 1; end<=N; end++)
		for (int start = 1; start < end; start++)
		{
			if (start + 1 == end)
				memo[start][end] = arr[start] == arr[end] ? 1 : 0;
			else if (arr[start] == arr[end] && memo[start + 1][end - 1])
				memo[start][end] = 1;
			else
				memo[start][end] = 0;
		}
}

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

	memset(memo, -1, sizeof(memo));

	int N;
	cin >> N;
	for (int i = 1; i <= N; i++)
		cin >> arr[i];

	Bottomup(N); // 모든 경우에서 팰린드롬 여부를 미리 계산

	int M;
	cin >> M;
	while (M--)
	{
		int S, E;
		cin >> S >> E;
		cout << Topdown(S, E) << '\n';
		
		cout << memo[S][E] << '\n';
	}

	return 0;
}

알고리즘 200일 프로젝트 - 95 day

'알고리즘 > BOJ' 카테고리의 다른 글

백준 2011번: 암호코드  (0) 2020.07.12
백준 9252번: LCS 2  (0) 2020.07.12
백준 2096번: 내려가기  (0) 2020.07.09
백준 11066번: 파일 합치기  (0) 2020.07.08
백준 1915번: 가장 큰 정사각형  (0) 2020.07.06

+ Recent posts