

쉽게 설명하기 빡세서 좀 코드랑 수식의 항연이에요. 미리 죄송합니다리미.
ACAYKP와 CAPCAK의 LCS는 ACAK입니다.LCS(i, j)를 정의합니다.A, B가 주어질 때, A[:i]와 B[:j]의 LCS의 길이를 반환합니다.A[:i]가 문자열을 0번째부터 i-1번째 인덱스까지 슬라이싱한 결과라는 것을 기억합시다. A의 길이를 N, B의 길이를 M으로 두면, i는 0부터 N, j는 0부터 M까지의 값을 가질 수 있습니다.i == 0 or j == 0일 때
i == 0인 경우 A[:i]는 A[:0], 즉 아무 글자도 없는 빈 문자열이 됩니다.j == 0인 경우 B[:j]도 빈 문자열이 됩니다.0이므로, 둘 중 하나라도 빈 문자열인 경우 LCS의 길이는 0이 됩니다.i == 0 or j == 0일 때, LCS(i, j) = 0i >= 1 and j >= 1일 때
A[:i-1]과 B[:j-1]의 LCS(LCS(i - 1, j - 1))에 각각 새로운 문자 A[i-1]과 B[j-1]가 추가되어, A[:i]와 B[:j]가 됐다고 생각합시다.LCS(i, j))를 구해야 합니다.A[i - 1]과 B[j - 1]을 비교합니다.
A[i - 1] == B[j - 1])LCS(i - 1, j - 1)에 1을 더해주면 됩니다.A[i - 1] == B[j - 1]인 경우, LCS(i, j) = LCS(i - 1, j - 1) + 1
A[i - 1] != B[j - 1])A[i - 1]과 B[j - 1]을 모두 포함할 순 없습니다. 즉, 한 쪽을 버려야 합니다.A 쪽에 추가된 A[i - 1]을 제외했을 때, LCS의 길이인 LCS(i - 1, j)와B 쪽에 추가된 B[j - 1]을 제외했을 때, LCS의 길이인 LCS(i, j - 1) 중LCS(i, j)가 됩니다.A[i - 1] != B[j - 1]인 경우, LCS(i, j) = max(LCS(i - 1, j), LCS(i, j - 1))LCS(i, j) | 반환값 |
|---|---|
i == 0 or j == 0 | 0 |
i >= 1 and j >= 1A[i-1] == B[j-1] | LCS(i-1, j-1) |
i >= 1 and j >= 1A[i-1] != B[j-1] | max(LCS(i, j-1), LCS(i-1, j) |
# 재귀를 좀 많이 할 것 같으니 미리 제한을 풀어 놓읍시다
import sys
sys.setrecursionlimit(10 ** 9)
# 문자열 A 및 B
str_A = input()
str_B = input()
N = len(str_A)
M = len(str_B)
# memo[i][j]는 LCS(i, j)의 값을 저장
memo = [[None] * (M + 1) for _ in range(N + 1)]
# str_A[:i]과 str_B[:j]의 LCS 길이를 구함
def LCS(i, j):
if i == 0 or j == 0:
return 0
elif memo[i][j] is None:
# 마지막 문자가 동일하면
if str_A[i - 1] == str_B[j - 1]:
# 마지막 문자를 제외한 LCS의 길이에, 1을 더함
memo[i][j] = LCS(i - 1, j - 1) + 1
else: # 마지막 문자가 다르면
# 적어도 한쪽의 마지막 문자는 LCS에 존재하지 않으니
# 양쪽에서 제거한 결과를 비교하고, 더 긴 길이를 반환
result_a = LCS(i - 1, j)
result_b = LCS(i, j - 1)
memo[i][j] = max(result_a, result_b)
return memo[i][j]
# 두 (전체)문자열의 LCS 길이
print(LCS(N, M))
LCS(0, 0)부터 LCS(N, M)까지 값을 1번씩 구하므로LCS(i, j) 함수는 필요없고, 반복문으로 바로 2차원 memo 리스트를 채우게 됩니다i==0 or j==0인 경우 0str_A[i - 1] == str_B[j - 1]인 경우, memo[i][j] = memo[i-1][j-1] + 1memo[i][j] = max(memo[i-1][j], memo[i][j-1])str_A = input()
str_B = input()
N = len(str_A)
M = len(str_B)
# memo[i][j]는
# memo[:i]과 memo[:j]의 LCS 길이를 구함
memo = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, M + 1):
# 마지막 문자가 동일하면
if str_A[i - 1] == str_B[j - 1]:
# 마지막 문자를 제외한 LCS의 길이에 1을 더함
memo[i][j] = memo[i-1][j-1] + 1
# 마지막 문자가 동일하지 않으면
else:
# .... 이건 걍 글 설명 보쇼
memo[i][j] = max(memo[i-1][j], memo[i][j-1])
# 두 (전체)문자열의 LCS 길이
print(memo[N][M])
잠은 언제자니