[BOJ][๐ก4][๋ฐฑ์ค#09252] LCS 2
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ, ๋์งธ ์ค์ LCS๋ฅผ ์ถ๋ ฅํ๋ค. LCS๊ฐ ์ฌ๋ฌ ๊ฐ์ง์ธ ๊ฒฝ์ฐ์๋ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๊ณ , LCS์ ๊ธธ์ด๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ๋์งธ ์ค์ ์ถ๋ ฅํ์ง ์๋๋ค.
์์
์ ๋ ฅ
ACAYKP
CAPCAK
์ถ๋ ฅ
4
ACAK
My Sol
A = input()
B = input()
al, bl = len(A), len(B)
LCS = [[[0, ''] for _ in range(bl+1)] for _ in range(al+1)]
for i in range(1, al+1):
for j in range(1, bl+1):
LCS[i][j] = sorted([LCS[i][j-1], LCS[i-1][j]], key=lambda x:-x[0])[0]
if A[i-1] == B[j-1]:
n, txt = LCS[i-1][j-1]
if n >= LCS[i][j][0]:
LCS[i][j] = [n+1, txt+A[i-1]]
ret = LCS[al][bl]
if ret[0]:
for a in ret:
print(a)
else:
print(0)
LCS๋ฅผ ํด๊ฒฐํ๋ DP๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ ํ ์คํธ๋ฅผ ๊ฐ๊ฐ A, B๋ก ๋๊ณ ์ด ๊ธธ์ด๋ฅผ al, bl๋ก ๊ณ์ฐํ์๋ค.
- ์ด al๊ณผ bl์ ๊ฐ๊ฐ ํ๊ณผ ์ด๋ก ๋๋ 2์ฐจ์ ๋ฐฐ์ด LCS๋ฅผ ๋ง๋ค๊ณ , ๊ฐ ์นธ์ ์ต์ด ๊ธธ์ด์ธ 0๊ณผ ๋น ๊ฐ์ ๊ฐ์ง ๋ฐฐ์ด๋ก ์ด๊ธฐํํ๋ค.
- ๊ฐ ํ๊ณผ ์ด์ ๋๋ฉฐ A์ B์ ํ ์ํ๋ฒณ์ด ๊ฐ๊ณ , ์ง์ ๊น์ง ๊ฐ๋ฅํ ์ต๋๊ณตํต๋ถ๋ถ์ ๊ธธ์ด๊ฐ ํ์ฌ ์นธ์ ๊ณตํต ๋ถ๋ถ์ ๊ธธ์ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๋ค๋ฉด ์ด๋ฒ LCS์นธ์ (i-1, j-1)์ ์ํ๋ฒณ์ ํ๋ ๋ถ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
LCS[i][j-1]
์LCS[i-1][j]
์ค ๊ธธ์ด๊ฐ ๋ ๊ธด ๊ฒ์ ๊ฐ ์นธ์ ์์ ํ์์์ ์ด๊ธฐํํ๋ค.LCS[al][bl]
์ด ๊ฒฐ๊ณผ์ด๊ณ , ์ด ๊ฐ์ด 0์ด๋ผ๋ฉด 0๋ง, ์๋๋ผ๋ฉด ๊ธธ์ด์ ํ ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ