[백준 10942] 팰린드롬? #273
ghdcksgml1
started this conversation in
1일 1알고리즘
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
문제
https://www.acmicpc.net/problem/10942
[문제설명]
숫자와 구간이 주어졌을 때 그 구간이 팰린드롬인지 0과 1로 나타내는 문제로
1<=N<=2,000까지 숫자가 주어지는데 구간은 1<=M<=1,000,000이라서
구간이 주어질때마다 팰린드롬인지 체크하는 시간복잡도는 O(N*M)으로 상당한 비용을 가진다.
따라서, [S,E]에 대한 팰린드롬여부 정보를 미리 저장해두고, 쿼리가 주어질때마다 리턴해주면 쿼리의 시간복잡도는 O(M*1)이 된다.
dp[2001][2001]에 [S,E] 정보를 넣어줘야하는데 어떻게 구할지 생각해보는데 팰린드롬의 특징을 하나 발견함
v = {1, 2, 1, 3, 1, 2, 1 }숫자가 있을때 팰린드롬인지를 파악하기 위해 양쪽끝에서 하나씩 줄여나가며 팰린드롬인지를 체크한다.
v[0] == v[6], v[1] == v[5], v[2] == v[4], v[3] == v[3] 이므로 팰린드롬이고, 여기서 v[0] == v[6]이더라도 나머지 [1,5] 가 모두 팰린드롬이여야 해당 배열이 팰린드롬이 된다.
여기서 dp를 이용하려면 [1,5]의 정보를 가지고 있다면? [1,5]가 팰린드롬이면 v[0] == v[6]이므로 v 배열은 팰린드롬이 되고, [1,5]가 팰린드롬이 아니라면 v[0] == v[6]이라도 팰린드롬이 아닌 배열이 된다.
또다른 특징은, v = {1, 2, 1, 3, 1, 2, 3 } 이라면, v[0] != v[6]일 경우 나머지 구간을 체크하지 않아도 팰린드롬이 아닌것을 확인할 수 있다.
위 두가지 특징을 이용해 dp를 짜보면, 다음과 같이 탑다운 재귀형식으로 코드를 짤 수 있다.
시간복잡도
시간복잡도는 dp[S][E]를 만드는데 O(N2)이 걸린다.
소스코드
Beta Was this translation helpful? Give feedback.
All reactions