<문제 링크>
https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
<정답 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import sys
input = sys.stdin.readline
n = int(input())
list_n = list(map(int, input().split()))
m = int(input())
dp_table = [[0] * (n+1) for _ in range(n+1)]
for i in range(1,n+1):
dp_table[i][i] = 1 # 길이가 1이면 항상 펠린드롬
for i in range(1,n):
if list_n[i-1] == list_n[i]:
dp_table[i][i+1] = 1 # 길이가 2이면 두 요소가 같으면 펠린드롬
for cnt in range(2,n): # 길이가 3이상이면
for i in range(1, n-cnt+1):
j = i + cnt
if list_n[i-1] == list_n[j-1] and dp_table[i+1][j-1] == 1:
dp_table[i][j] = 1 # 맨 앞뒤 값이 같고 그 사이가 펠린드롬이면 펠린드롬
for _ in range(m):
s, e = map(int, input().split())
print(dp_table[s][e])
|
cs |
DP(dynamic programming)으로 풀지 않으면 시간초과 발생
펠린드롬 여부를 사전에 판단해 dp_table에 저장해두고,
구하는 부분의 결과를 빠르게 반환하는 방법 사용
한 범위의 펠린드롬 여부를 확인하기 위해 양 끝값과 그 사이의 페린드롬 여부를 확인한다는 점에서,
작은 문제의 결과에 기반해 큰 문제를 판단하는 DP의 최적 부분 구조 특징을 활용한다.
리스트 슬라이싱 대비 장점
- 리스트 슬라이싱
- 해당 구간 추출 및 역순으로 뒤집어 원본이랑 비교하는 시간 O(n) -> 시간초과
- DP
- 모든 구간 미리 계산, 결과 출력에 걸리는 시간 O(1)
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 9375번 패션왕 신해빈(딕셔너리) (1) | 2024.04.26 |
---|---|
정규표현식_python 단어만 남기고 비단어 문자 제거 (0) | 2024.04.25 |
백준_python 1003번 피보나치 함수(다이나믹프로그래밍) (0) | 2024.04.22 |
백준_python 2178번 미로 탐색(그래프, BFS) (0) | 2024.04.21 |
백준_python 1463번 1로 만들기(BFS, DP) (0) | 2024.04.21 |