본문 바로가기

알고리즘/백준

[백준] 1509번 : 펠린드롬 분할

728x90

1509번: 팰린드롬 분할

 

1509번: 팰린드롬 분할

세준이는 어떤 문자열을 팰린드롬으로 분할하려고 한다. 예를 들어, ABACABA를 팰린드롬으로 분할하면, {A, B, A, C, A, B, A}, {A, BACAB, A}, {ABA, C, ABA}, {ABACABA}등이 있다. 분할의 개수의 최솟값을 출력하

www.acmicpc.net

🤔 문제분석

팰린드롬의 분할개수의 최소값을 구하는 문제로, 지정된 start와 end에서 팰린드롬인지 아닌지 판별을 우선 해야한다.

아래의 예로 ABBAAB의 최소 팰린드롬의 개수를 구하는 과정을 보면 이전에 구했던 A, AB, ABB, ABBA … 가 최소개수를 가지고 있어야한다. X라고 표기된건 현재 팰린드롬이 아니라 무시한다.

💻 코드

import sys
input = sys.stdin.readline

word = str(input().strip())
L = len(word)

is_p = [[False for _ in range(L)] for _ in range(L)]
dp = [0 for _ in range(L+1)]

for i in range(L):
    is_p[i][i] = True

for i in range(L-1):
    if word[i] == word[i+1]:
        is_p[i][i+1] = True

for k in range(2, L):
    for i in range(L-k):
        start = i
        end = i+k
        if word[start] == word[end] and is_p[start+1][end-1]:
            is_p[start][end] = True

for end in range(L):
    dp[end+1] = float('inf')
    for start in range(end + 1):
        if is_p[start][end]:
            dp[end+1] = min(dp[end+1], dp[start] + 1)

print(dp[L])

🎯 피드백 및 개선사항

팰린드롬인지 아닌지에대한 판별은 쉽게 해결 할 수 있었으나, 최소 분할 팰린드롬의 개수를 구하는과정은 문제를 풀면서 생각을 많이 해보게 되었다. 이전에 구했던 최소팰린드롬의 개수를 하나하나씩 다 비교해보면서 현재 리터리에션에서의 펠린드롬의 최소 개수를 최소화 한다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1113번 : 수영장 만들기  (1) 2024.01.31
[백준] 17143번 : 낚시왕  (1) 2024.01.30
[백준] 2056번 : 작업  (0) 2024.01.28
[백준] 2169번 : 로봇 조종하기  (1) 2024.01.24
[백준] 15486번 : 퇴사 2  (1) 2024.01.24