For Programmer

백준 9252번 파이썬 문제풀이(LCS 2) - dp(역추적) 본문

코팅테스트/백준 문제 모음

백준 9252번 파이썬 문제풀이(LCS 2) - dp(역추적)

유지광이 2022. 4. 13. 23:02
728x90


a = '#' + input()
b = '-' + input()
dp = [[0 for _ in range(len(b))] for _ in range(len(a))]

'''
단순히 생각해서 2개의 문자열에 뒤에 같은 문자가 들어오면 공통 부분 문자열의 개수가 1개씩 증가한다는 개념을 이용해서
DP를 구하면 쉽다
'''
# 역추적을 위한 pre배열
pre = [[[-1, -1] for _ in range(len(b))] for _ in range(len(a))]

for i in range(1, len(a)):
    for j in range(1, len(b)):
        if a[i] == b[j]:
            dp[i][j] = dp[i - 1][j - 1] + 1
            pre[i][j] = [i - 1, j - 1]
        else:
            if dp[i - 1][j] > dp[i][j - 1]:
                dp[i][j] = dp[i - 1][j]
                pre[i][j] = [i - 1, j]
            else:
                dp[i][j] = dp[i][j - 1]
                pre[i][j] = [i, j - 1]
print(dp[len(a) - 1][len(b) - 1])

x = len(a) - 1
y = len(b) - 1
ans = ''
while x != 0 and y != 0:
    if pre[x][y][0] == x - 1 and pre[x][y][1] == y - 1:
        ans += a[x]

    x, y = pre[x][y][0], pre[x][y][1]

if ans != '':
    print(ans[::-1])
728x90
Comments