
https://www.acmicpc.net/problem/9252
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ, ๋์งธ ์ค์ LCS๋ฅผ ์ถ๋ ฅํ๋ค.
LCS๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๊ณ , LCS์ ๊ธธ์ด๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋์งธ ์ค์ ์ถ๋ ฅํ์ง ์๋๋ค.

import sys
input = sys.stdin.readline
dp = ['']*1000
w1 = input().strip()
w2 = input().strip()
for i in range(len(w1)):
temp = ''
for j in range(len(w2)):
# temp๋ฅผ ๊ณ์ํด์ LCS๋ก ๊ฐฑ์ ํด์ค
if len(temp) < len(dp[j]):
temp = dp[j]
# LCS์ ๋ฌธ์์ด ํ๋๊ฐ ๋ ๋ถ๋ ๊ฒฝ์ฐ
elif w1[i] == w2[j]:
dp[j] = temp + w2[j]
dp = list(set(dp)) # ์ค๋ณต ์ ๊ฑฐ
dp = sorted(dp,key = lambda x : -len(x)) # ๋ฌธ์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
LCS = dp[0]
if LCS:
print(len(LCS))
print(LCS)
else:
print(0)
temp์๋ LCS๋ง์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
ํ์ฌ์ LCS๊ฐ ๋ค์ด๊ฐ ์ํ์์, ๋ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ๋ง๋๊ฒ ๋๋ฉด ์ถ๊ฐํด์ ๋ฃ์ด์ค๋ค.
# LCS์ ๋ฌธ์์ด ํ๋๊ฐ ๋ ๋ถ๋ ๊ฒฝ์ฐ
elif w1[i] == w2[j]:
dp[j] = temp + w2[j]
์ด์ ๊ฐ์ ์์ ์ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ํด ์คํํ๋ค.
dp๋ฅผ ๊ฐ์ง๊ณ ์ต์ข ์ ์ธ LCS๋ฅผ ๊ตฌํ๋ค.
dp๋ 1000๊ฐ์ ๋ฆฌ์คํธ์ด๊ธฐ์, ์ค๋ณต์ ์ ๊ฑฐํด์ฃผ๊ธฐ ์ํด ์งํฉ์ ํ์ฉํ๋ค.
dp = list(set(dp)) # ์ค๋ณต ์ ๊ฑฐ
์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด, ์ฆ LCS๋ฅผ ์ฐพ์์ฃผ๊ธฐ ์ํด์ ์ ๋ ฌํ๋ค.
dp = sorted(dp,key = lambda x : -len(x)) # ๋ฌธ์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
dp[0] ์๋ ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด์ด ์๊ฒ ๋๊ณ , ์ด๋ LCS์ ํด๋นํ๋ค.LCS๋ฅผ ๊ธธ์ด์ ํจ๊ป ์ถ๋ ฅํด์ค๋ค.
LCS๊ฐ ๋น์ด์๋ค๋ฉด, 0๋ง ์ถ๋ ฅํ๋ค.LCS 1 ๋ฌธ์ ๋ฅผ ํ๊ณ , ๋ฌธ์์ด๋ ์ ์ฅํด์ฃผ๊ธฐ ์ํด์ dp์์ ๊ธธ์ด๊ฐ ์๋ ๋ฌธ์์ด ์์ฒด๋ฅผ ์ ์ฅํด์ฃผ๋ฉฐ ํด๊ฒฐํ๋ค.
์ ๋ ฅ์ด ๋ง์ง ์์ ๊ฒฝ์ฐ์์๋ ์ด์ ๊ฐ์ด ์ถฉ๋ถํ ํ ์ ์์ ๊ฒ ๊ฐ๋ค!