문제
풀이
- 다이나믹 프로그래밍 문제로 S와 E가 입력될 때마다 처음부터 검사하면 시간초과이다.
- S와 E가 같다면 무조건 팰린드롬이다.
- S와 E가 1차이라면 num[S]와 num[E]만 검사하면 된다.
- S와 E에서부터 시작해서 num[S]와 num[E]가 같으면서 사이의 수열이 팰린드롬이라면 그 수열은 팰린드롬이다.
- 여기서 S와 E의 값을 각각 1늘리고 1줄이는 방식으로 검사하면서 num[S]와 num[E]가 같지않다면 그 수열은 팰린드롬이 아니다.
- '\n' 을 사용해야 한다. endl을 사용할 경우 시간초과가 발생한다.
코드
#include <iostream>
using namespace std;
bool cache[2001][2001];
int num[2001];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(nullptr);
int N, M;
cin >> N;
for (int i = 1; i <= N; ++i)
{
cin >> num[i];
}
cin >> M;
// S와 E가 같다면 true
for (int i = 1; i <= N; ++i)
{
cache[i][i] = true;
}
// E == S + 1일 경우 두 수만 비교해서 같다면 true
for (int i = 1; i < N; ++i)
{
if (num[i] == num[i + 1])
{
cache[i][i + 1] = true;
}
}
while (M--)
{
int S;
int E;
cin >> S >> E;
// 양 끝에서 부터 검사를 시작
// S에서의 값과 E에서의 값이 같으면서 그 사이의 수열이 팰린드롬이면 S와 E까지의 수열도 팰린드롬이다.
// 점점 가운데로 향하면서 검사
int temp_start = S;
int temp_end = E;
while (temp_start <= temp_end)
{
if (num[temp_start] == num[temp_end] && cache[temp_start][temp_end] == 1)
{
cache[S][E] = true;
break;
}
else if (num[temp_start] != num[temp_end])
{
cache[S][E] = false;
break;
}
temp_start++;
temp_end--;
}
cout << cache[S][E] << '\n';
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 20040: 사이클 게임 (0) | 2023.10.16 |
---|---|
[백준][C++] 17404: RGB거리 2 (0) | 2023.10.15 |
[백준][C++] 9252: LCS 2 (0) | 2023.10.14 |
[백준][C++] 2239: 스도쿠 (0) | 2023.10.12 |
[백준][C++] 1806: 부분합 (0) | 2023.10.11 |