BOJ
[BOJ] 10942번 : 팰린드롬?
hg_studio
2023. 4. 14. 18:14
https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
dp문제이므로 테이블 설정을 잘 해주어야 한다.
d[a][b]=k : a부터 b 팰린드롬이라면 k=1, 아니라면 k=0
우선, a부터 a는 항상 팰린드롬이다.
추가로 길이가 1 차이나는 a와 a-1는 서로 값이 같다면 팰린드롬이 된다.
그리고 길이가 2 차이부터 n-1 까지 나는 숫자가 팰린드롬인지 검사해주면 된다.
시작점이 s 이고 끝점이 e라면 두 숫자가 같으면서, 시작점과 끝점을 제외한 가운데 숫자가 팰린드롬이면 s부터 e는 팰린드롬에 해당된다.
따라서 이런 사실을 바탕으로 코드를 작성하면 아래와 같다.
#include <iostream>
#include <algorithm>
using namespace std;
int a[2005];
int d[2005][2005]; //d[a][b]=k : a~b까지 팰린드롬이라면 1, 아니라면 0
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++){
d[i][i]=1; //자기자신만은 팰린드롬임
if(a[i-1]==a[i]) d[i-1][i]=1; //차이가 1 나는 애들 처리해줌
}
for(int gap=2; gap<n; gap++){ //차이가 2 나는 애들부터 n-1 까지 처리해줌
for(int i=1; i<=n-gap; i++){
int s=i, e=i+gap; //시작점은 i이고, 끝점은 i+gap임
//시작점과 끝점이 같아야하고
//시작점과 끝점을 제외한 가운데 숫자가 팰린드롬이어야함
if(a[s]==a[e] && d[s+1][e-1]) d[s][e]=1;
}
}
int tc; cin>>tc;
while(tc--){
int s,e;
cin>>s>>e;
cout<<d[s][e]<<'\n';
}
return 0;
}