본문 바로가기

algorithm/BOJ

백준 10942_팰린드롬?(C++)

 

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

 

10942번: 팰린드롬?

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

www.acmicpc.net

[문제 풀이]

DP를 이용하여 문제를 해결했습니다.  

이 문제의 경우 완전탐색으로 풀 경우 0.5초의 시간을 넘어가기 때문에 DP를 이용하였습니다.
세 가지의 경우로 나눠서 dp배열에 메모제이션 해주었습니다.

첫 번째 경우
문자열의 길이가 1인 경우 항상 팰린드롬은 성립하므로 dp[i][i] = 1로 메모제이션 해주었습니다.
두 번째 경우 
문자열의 길이가 2인 경우 앞뒤 문자가 같은지 판별하여 같은 경우 dp[i][i+1] = 1로 메모제이션 해주었습니다.
세 번째 경우
문자열의 길이가 3보다 큰 경우입니다. 이때는 시작지점의 문자열과 끝 지점의 문자열이 같으면서 dp[i + 1] [j - 1]이 같은 경우 부분 문자열의 길이가 팰린드롬이므로 dp[i][j] = 1로 메모제이션 해주었습니다.

그 후 M 번의 경우를 돌면서 dp배열의 값을 출력해주었습니다.

[코드]

#include<iostream>

using namespace std;

int N, M;
int arr[2001];
int dp[2001][2001] = { 0, };

int main() {

	scanf("%d", &N);

	for (int i = 1; i <= N; i++)
		scanf("%d", &arr[i]);

	//길이가 1인 경우
	for (int i = 1; i <= N; i++)
		dp[i][i] = 1;

	//길이가 2인 경우
	for (int i = 0; i < N; i++) {
		if (arr[i] == arr[i + 1])
			dp[i][i + 1] = 1;
	}

	//길이가 3이상인 경우
	for (int k = 3; k <= N; k++) {
		for (int i = 1; i <= N - k + 1; i++) {
			int j = i + k - 1;

			if (arr[i] == arr[j] && dp[i + 1][j - 1])
				dp[i][j] = 1;
		}
	}

	scanf("%d", &M);

	for (int i = 0; i < M; i++) {
		int start, end;
		
		scanf("%d %d", &start, &end);
		printf("%d\n", dp[start][end]);

	}

    return 0;

}

 

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 1713_후보 추천하기(C++)  (0) 2020.09.24
백준 1920_수 찾기(C++)  (0) 2020.09.22
백준 14889_랜선 자르기(C++)  (0) 2020.06.07
백준 5557_1학년(C++)  (0) 2020.06.04
백준 12865_평범한 배낭(C++)  (0) 2020.05.27