반응형
https://www.acmicpc.net/problem/13275
13275번: 가장 긴 팰린드롬 부분 문자열
첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있으며 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
www.acmicpc.net
가장 긴 팰린드롬 부분 문자열 문제
문자열 S의 부분 문자열 중에 가장 길이가 긴 회문을 구하는 문제
Manacher 알고리즘을 이용하여 해결할 수 있었다.
https://www.acmicpc.net/problem/14444
14444번: 가장 긴 팰린드롬 부분 문자열
알파벳 소문자로만 이루어진 문자열 S가 주어졌을 때, S의 부분 문자열 중에서 팰린드롬 이면서 길이가 가장 긴 것의 길이를 구하는 프로그램을 작성하시오.
www.acmicpc.net
백준 14444번 문제와 동일한 문제지만, 시간제한이 14444번 문제와 다르게 0.5초로 주어졌다.
상대적으로 시간적 여유가 부족하므로, 최대한 불필요한 반복 연산 등을 제거하여 구현하였다.
📌문제 접근 포인트
1. 회문의 부분 문자열의 크기를 구하기 위해서 다이나믹 프로그래밍을 이용할 수 있지만, 시간 복잡도는 O(n²) 이므로 더 빠른 방법을 생각해 보자.
2.. 회문의 부분 문자열의 크기를 구하는 알고리즘 중에서 Manacher 알고리즘을 이용하면 시간 복잡도 O(n)으로 계산할 수 있다. (모른다면 아래 링크내용 참고)
3. 정직하게 Manacher 알고리즘 방식 그대로 구현 후, 불필요한 연산을 줄여서 시간을 굉장히 많이 단축할 수 있었다.
https://edder773.tistory.com/178
[알고리즘] Manacher 알고리즘 정리 (python)
Manacher 알고리즘 회문(Palidnrome)에 관한 문제를 빠르게 풀 수 있도록 만들어주는 알고리즘 문자열 S의 부분 문자열 중에서 팰린드롬인 것 중 가장 긴 것의 길이를 구하는 알고리즘을 해결하는 것
edder773.tistory.com
반응형
⚙ 내가 푼 정답 코드
def manachers(S, N):
A = [0] * N
r, p = 0, 0
for i in range(N):
if i <= r:
A[i] = min(A[2 * p - i], r - i)
while i - A[i] - 1 >= 0 and i + A[i] + 1 < N and S[i - A[i] - 1] == S[i + A[i] + 1]:
A[i] += 1
if r < i + A[i]:
r = i + A[i]
p = i
return A
import sys
S = "#"+"#".join(sys.stdin.readline())+"#"
N = len(S)
A = manachers(S, N)
print(max(A))
반응형
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 1543] 문서 검색 (python) (0) | 2023.04.18 |
---|---|
[백준 16163] #15164번_제보 (python) (0) | 2023.04.17 |
[백준 14444] 가장 긴 팰린드롬 부분 문자열 (python) (0) | 2023.04.16 |
[백준 16235] 나무재태크 (python) (0) | 2023.04.15 |
[백준 16236] 아기 상어(python) (0) | 2023.04.15 |
댓글