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

 

10942번: 팰린드롬?

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

www.acmicpc.net

 문제설명 

 

1. 수열이 주어지고 수열의 범위를 입력하면 그범위가 팰린드롬을 이루는지 출력하는 문제이다.

 

 알고리즘 

 

1. 수열의 범위가 주어지면 그때그때 팰린드롬 여부를 구하여서 출력 -> 시간초과

1. 먼저 수열의 모든 경우의 수에 따라 팰린드롬을 구한뒤 수열의 범위가 주어지면 별도의 계산 없이 바로 출력.

2. 길이가 1인 수열은 무조건 팰린드롬이고 길이가 2인 수열은 바로 다음수와 같으면 팰린드롬이다.

3. 길이가 3인 수열부터는 길이 순으로 팰린드롬 여부를 확인한다.

    - 맨앞과 맨뒤가 같고,그 안에 있는 수열이 팰린드롬이다 -> 팰린드롬

 

 

 코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
 
using namespace std;
 
int dp[2002][2002];
int N, M, arr[2002];
void func() {
 
    //길이가 1인 수열은 무조건 팰린드롬이다.
    for (int i = 1; i <= N; i++) {
        dp[i][i] = 1;
    }
 
    //길이가 2인 수열은 앞뒤가 같으면 팰린드롬이다.
    for (int i = 1; i < N; i++) {
        if (arr[i] == arr[i + 1])dp[i][i + 1= 1;
        else dp[i][i + 1= 0;
    }
 
    //길이가 3이상
    //길이가 3인것부터 N인것 순으로 구하는거
 
    for (int i = 2; i < N; i++) {
        for (int j = 1; j <= N - i; j++) {
            //앞뒤가 같고 ,앞 뒤 사이에있는 수들이 팰린드롬인 경우
            if (arr[j] == arr[j + i] && dp[j + 1][j + i - 1])
                dp[j][j + i] = true;
        }
    }
 
}
 
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
 
    cin >> N;
    for (int i = 1; i <= N; i++)cin >> arr[i];
 
    cin >> M;
 
    for (int i = 0; i < 2002; i++) {
        for (int j = 0; j < 2002; j++) {
            dp[i][j] = 0;
        }
    }
 
    func();
    for (int i = 0; i < M; i++) {
        int S, E;
        cin >> S >> E;
        cout << dp[S][E] << "\n";
    }
}
 
cs

참고한 블로그 : https://jaimemin.tistory.com/453

'c++ > 백준' 카테고리의 다른 글

백준 2792번 : 보석상자  (0) 2020.05.27
백준 3020번: 개똥 벌레  (0) 2020.05.27
백준 1213번 : 팰린드롬 만들기  (0) 2020.05.26
백준 1063번 : 킹  (0) 2020.05.26
백준 1004번 : 어린 왕자  (0) 2020.05.26
ariz1623