정리와기록 블로그

[10942] 팰린드롬? 본문

BOJ/동적계획법

[10942] 팰린드롬?

뫂림 2020. 4. 4. 10:12

문제: https://www.acmicpc.net/problem/10942

 

10942번: 팰린드롬?

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

www.acmicpc.net

 

접근:

  • 팰린드롬을 확인하는 함수인 isFel(int i, int j)는 주어진 수열의 i번째, j번째가 같은 지 확인하고, 같으면 다음 단계인 isFel(i+1,j-1)을 확인한다.
  • cache배열은 2000*2000 2차원 배열을 사용했다. 이미 답이 나왔던 팰린드롬이 sub problem으로 나온다면 cache를 사용하여 바로 답을 반환한다.
  • 시간복잡도는 O(M*N)이지만, 하나의 함수 호출 시 팰린드롬을 검사하는 최대 횟수는 1000회이며, cache를 사용하기 때문에 O(M*N)이 그대로 가지는 않을 것 같다.

 

코드:

#include <iostream>
#include <vector>
#include <memory.h>

using namespace std;

vector<int> A;
int N, M;
int cache[2000][2000];

// line의 i부터 j까지가 펠린드롬인지 확인
bool isFel(int i, int j)
{
	if (i == j) return true;
	if (i == j - 1) return A[i] == A[j];
	
	int& ret = cache[i][j];
	if (ret != -1) { return ret; }

	return ret = (A[i] == A[j] && isFel(i + 1, j - 1));
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);
	memset(cache, -1, sizeof(cache));
	
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		int a;
		cin >> a;
		A.push_back(a);
	}

	cin >> M;
	while (M--)
	{
		int i, j;
		cin >> i >> j;
		cout << isFel(i - 1, j - 1) << "\n";
	}
	return 0;
}

'BOJ > 동적계획법' 카테고리의 다른 글

[10835] 카드게임  (0) 2020.09.01
[1890] 점프  (0) 2020.04.04
[11055] 가장 큰 증가 부분 수열  (0) 2020.03.07
[14002] 가장 긴 증가하는 부분 수열 4  (0) 2020.03.07
[9465] 스티커  (0) 2020.03.07
Comments