[BOJ][๐ก5][๋ฐฑ์ค#09251] LCS
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
ACAYKP
CAPCAK
์ถ๋ ฅ
4
My Sol
A, B = input(), input()
al, bl = len(A), len(B)
mat = [[0]*(bl+1) for _ in range(al+1)]
for i in range(1, al+1):
a = A[i-1]
for j in range(1, bl+1):
b = B[j-1]
mat[i][j] = max(mat[i][j-1], mat[i-1][j])
if a == b:
mat[i][j] = max(mat[i-1][j-1]+1, mat[i][j])
print(mat[al][bl])
LCS์ ๊ท์น๋๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด ๋๋ค. ์ด์ ์์ ๋์จ ๊ฒ ์ค ์ต๋ ์ค์ฒฉ์ ์๋ฅผ ์ฎ๊ฒจ์์ ์ด๋ฒ ์ฐจ๋ก์์ ๋ ์ค์ฒฉ์ด ๋๋ค๋ฉด ํ๋๋ฅผ ์ฌ๋ ค ๊ธฐ๋กํด์ค๋ค. ์ด๊ฒ์ด ์ดํ์ ๋์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
word1, word2 = input(),input()
l1, l2 = len(word1), len(word2)
cache = [0] * l2
for i in range(l1):
cnt = 0
for j in range(l2):
if cnt < cache[j]:
cnt = cache[j]
elif word1[i] == word2[j]:
cache[j] = cnt + 1
print(max(cache))
์ฐ์ฐ์๊ฐ์ด 5๋ฐฐ๋ ์งง์๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฝ๋๋๋ ์งง์ ์ฝ๋๊ฐ ์์ด์ ๋ถ์ํด๋ณด๋ ค ํ๋ค.
cache๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ ๊ฒ ๊ฐ์๋ฐ 2์ค for๋ฌธ๋ ๋๋ฆฌ๊ณ โฆ ์ด๋ค ๋ฐฉ์์ผ๋ก ํผ ๊ฑด์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ