백준 번 바로가기
첫 번째 풀이#
# 입력
import sys
read = sys.stdin.readline
A, B = read().strip(), read().strip()
n, m = len(A), len(B)
LCS = [[0] * (m + 1) for _ in range(n + 1)]
LCS2 = [[''] * (m + 1) for _ in range(n + 1)]
# 처리 - LCS 알고리즘 이용
for i in range(1, n + 1):
for j in range(1, m + 1):
if A[i - 1] == B[j - 1]:
LCS[i][j] = LCS[i - 1][j - 1] + 1
LCS2[i][j] = LCS2[i - 1][j - 1] + A[i-1]
else:
LCS[i][j] = max(LCS[i - 1][j], LCS[i][j - 1])
if LCS[i-1][j] > LCS[i][j-1]:
LCS2[i][j] = LCS2[i-1][j]
else:
LCS2[i][j] = LCS2[i][j-1]
print(LCS[n][m])
print(LCS2[n][m])
두 번째 풀이#
# 입력
import sys
read = sys.stdin.readline
A, B = read().strip(), read().strip()
n, m = len(A), len(B)
LCS = [[0] * (m + 1) for _ in range(n + 1)]
# 처리 - LCS 알고리즘 이용
for i in range(1, n + 1):
for j in range(1, m + 1):
if A[i - 1] == B[j - 1]:
LCS[i][j] = LCS[i - 1][j - 1] + 1
else:
LCS[i][j] = max(LCS[i - 1][j], LCS[i][j - 1])
print(LCS[n][m])
ans = ''
x, y = n, m
while x > 0 and y > 0:
if LCS[x][y] == LCS[x - 1][y]:
x -= 1
elif LCS[x][y] == LCS[x][y - 1]:
y -= 1
else:
ans += A[x-1]
x -= 1
y -= 1
print(ans[::-1])
CODE REVIEW#
- 백준 9251번 - LCS의 연장선 격인 문제.
- 첫 번째 풀이의 경우
시간초과
에러가 발생했는데, string을 저장하는 과정 자체가 시간이 오래 소요되는 것으로 판단된다.
- 두 번째 풀이에서는 LCS2 matrix을 사용하지 않고, LCS을 그대로 사용하면서 역추적 해나가는 방식을 택했다.
- 역추적 해가면서 대각선으로 움직이는 시점의 문자를 더해가며 문자열을 찾아낼 수 있다.