백준 문제풀이

10942 - 팰린드롬? / gold 4 / DP

RonLee 2022. 12. 26. 18:40

https://www.acmicpc.net/problem/10942

 

10942번: 팰린드롬?

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

www.acmicpc.net

- 시간 초과

'''
10942 - 팰린드롬? / gold 4 
'''
import sys

input = sys.stdin.readline


def is_palindrome(start, end, arr):
    flag = 1
    while True:
        if start < end:
            if arr[start] == arr[end]:
                start += 1
                end -= 1
                continue
            else:
                flag = 0
                break
        else:
            break
    print(flag)


n = int(input())
arr = list(map(int, input().split()))
m = int(input())

for _ in range(m):
    s, e = map(int, input().split())
    is_palindrome(s - 1, e - 1, arr)

 

- 정답

'''
10942 - 팰린드롬? / gold 4 / DP
'''
import sys

input = sys.stdin.readline

n = int(input())
arr = list(map(int, input().split()))
m = int(input())

dp = [[0 for _ in range(n)] for _ in range(n)]

# 길이가 1인 경우
for i in range(n):
    dp[i][i] = 1
# 길이가 2인 경우
for i in range(n - 1):
    if arr[i] == arr[i + 1]:
        dp[i][i + 1] = 1
# 길이가 3이상인 경우
for i in range(2, n):
    for j in range(n - i):
        if arr[j] == arr[i + j] and dp[j + 1][i + j - 1] == 1:
            dp[j][i + j] = 1

for _ in range(m):
    s, e = map(int, input().split())
    print(dp[s - 1][e - 1])

 

dp 알고리즘

  •  dp 리스트를  [0][0] ~ [n-1][n-1] 까지 만들기
    • dp[S-1][E-1] = S에서 부터 E까지 팰린드롬인지 확인
  • 길이가 1인경우, EX) s=3, e=3 무조건 팰린드롬이므로, dp[i][i] = 1로 바꾸기
  • 길이가 2인경우, arr[i] == arr[i+1] 같으면, dp[i][i+1] = 1 로 바꾸기
  • 길이가 3인경우
    • for 문의 i 는 길이를 나타내는 녀석 (2부터 시작 ~ 최대길이 n-1까지)
    • for 문의 j는 해당 인덱스를 가리키는 값 (0부터 ~ n-i 까지)
      • dp 의 인덱스 최대값은 = n-1 이므로, (dp[n - 1][n - 1])
      • i + j 인덱스가 n - 1 보다 무조건 작거나 같아야 하므로
      •  i + j <= n - 1 이다. 
      • j <= n - i - 1 이므로, j 의 범위는 0 ~ n - i - 1 이어야 한다
      • 따라서 for j in range(n - i) 로 코드 설정