백준 알고리즘
[백준 문제풀이] 백준 10942 팰린드롬?
mindun
2025. 2. 20. 13:14
반응형

- 문제 구성 및 이해
팰린드롬: 121 처럼 뒤집어도 숫자가 같은 것을 지칭한다.
시간 제한이 0.5초, N <= 2000, 질문 수 <= 1000000 이므로 n * m 으로 풀 수없음 -> dp 활용
top -> bottom 방식의 dp를 활용
기본적인 점화식
dp[i][j] -> i와 j 가 펠린드롬인지 아닌지를 true, false로 나타내줌
1. dp[i][i] 는 true로 미리 적용; 한자리 수는 무조곤 펠린드롬 수
2. dp[i][j] 를 구하기 위한 방법 적용
1) dp[i][j] == true -> 바로 true 반환 ( 함수 이용 )
2) dp[i][j] == false && list[i] == list[j] (입력받은 배열) 면 재귀 호출을 이용하여 dp[i+1][j-1] 값으로 이동
3. 함수의 반환값이 dp[i][j] = 재귀함수(dp[i+1][j-1]) 이므로 값 저장 가능!
#include <iostream>
#include <vector>
std::vector<std::vector<bool>> dp;
std::vector<int> list;
bool check(int a, int b) {
if (dp[a][b]) return true;
else if (list[a] != list[b]) return false;
if (a + 1 <= b - 1) {
return dp[a][b] = check(a + 1, b - 1);
}
else return true;
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n;
std::cin >> n;
list.assign(n + 1, 0);
dp.assign(n + 1, std::vector<bool>(n + 1, 0));
for (int i{ 1 }; i <= n; i++) {
std::cin >> list[i];
}
for (int i{ 1 }; i <= n; i++) {
dp[i][i] = true;
}
int m;
std::cin >> m;
int a, b;
for (int i{ 0 }; i < m; i++) {
std::cin >> a >> b;
std::cout << check(a, b) << "\n";
}
}
반응형