[Baekjoon/๐ฅโ ค] 9251: LCSโญ
๐โโ๏ธ LCS
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
๐โโ๏ธ ์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๐โโ๏ธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๐ฉโ๐ป Algoritm: dp ์ ์ฉ
ํด๋น ๋ฌธ์ ๋ ์๊ฐ ์ ์ฝ์ด ์๋ค. ๋ฐ๋ผ์ ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๋๊ฐ ๋ฌด์ฒ ์ค์ํ๋ค.
์ด ๋ฌธ์ ์์๋ dp๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค. 1์ฐจ์ ๋ฐฐ์ด์ ๋์ ๊ฐ์ ํตํด ํด๊ฒฐํ ์๋ ์๊ณ , 2์ฐจ์ ๋ฐฐ์ด์ ์บ์๋ฅผ ๋ง๋ค์ด ํด๊ฒฐํ ์๋ ์๋ค.
โจ๏ธ dp: ๋์ ํฉ
- ๋ฌธ์์ดa๋ฅผ ๊ธฐ์ค์ผ๋ก 1์ฐจ์ ๋ฐฐ์ด์ ์์ฑํ๋ค.
- ๋ฌธ์์ดb์ ๋ฌธ์ ํ๋ํ๋๋ฅผ ๋ ๋๋ง๋ค ๋ฌธ์์ดa ์ ์ฒด๋ฅผ ํ์ธํ๋ค.
- ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ํด๋น ์์น ์ ๊น์ง์ ์ต๋ ๋์ ํฉ + 1๋ก ๋์ ํฉ์ ์ ๋ฐ์ดํธ ํ๋ค.
์ฝ๋๋ฅผ ํตํด์ ์ ๊ณผ์ ์ ํ์ธํด๋ณด์!!
๋์ ํฉ ์๊ณ ๋ฆฌ์ฆ1: ์๊ฐ์ด๊ณผ
str1 = input()
str2 = input()
if str1 == str2:
print(len(str1))
else:
dp = [0]*len(str1)
for i in range(len(str2)):
for j in range(len(dp)-1, -1, -1):
if str2[i] == str1[j]:
try:
dp[j] = max(dp[0:j])+1
except:
dp[j] = 1
print(max(dp))
- ์ ๋ฐ์ดํธ๋๋ ๋์ ํฉ์ด ๋ค์ ๋จ๊ณ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๊ธฐ ์ํด ๋ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์์๋ ๋ฌธ์์ด์ ๋์์ ๋ถํฐ ํ์ธํ๋ค.
- ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ์์์ผ ๋๋ ํด๋น ์์น ์ ๋์ ํฉ์ ์ต๋๊ฐ์ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ 1์ ์ค์ ํด์ค๋ค.
ํด๋น ํ์ด๋ ๋จ์ ๋ฐ๋ณต๋ฌธ์ด๋ฏ๋ก pypy3๋ก๋ ๊ฐ์ ํ ํต๊ณผํ์ง๋ง python3๋ก๋ ์๊ฐ์ด๊ณผ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์ ํ์ด์์ ๋ฐ๋ณต๋ฌธ์ ๋ ๋๋ง๋ค max๋ฅผ ๊ณ์ฐํ๋ ๋ถ๋ถ์ด ์๊ฐ์ ๋ง์ด ์ก์๋จน๋ ๊ฒ์ด๋ผ ์๊ฐํด ํด๋น ๋ถ๋ถ์ ๊ณ ๋ คํด ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์๋ค.
๋์ ํฉ ์๊ณ ๋ฆฌ์ฆ2
str1 = input()
str2 = input()
if str1 == str2:
print(len(str1))
else:
dp = [0]*len(str1)
for i in range(len(str2)):
v_max = 0 # max ๊ฐ ์ ์ฅ ๋ณ์
for j in range(len(str1)):
if dp[j] > v_max: # max ๊ฐ ์
๋ฐ์ดํธ
v_max = dp[j]
elif str1[j] == str2[i]: # max+1 ๊ฐ์ผ๋ก ๋์ ํฉ ์
๋ฐ์ดํธ
dp[j] = v_max + 1
print(dp)
print(max(dp))
์ด๋ ๊ฒ ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ๋ฉด ํ์ ํ ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
โจ๏ธ dp: 2์ฐจ์ ๋ฐฐ์ด ์บ์ ์ฌ์ฉ
ํด๋น ํ์ด๋ ์ ํ์ด์๋ ๋ค๋ฅด๊ฒ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค. ๊ทธ ๊ณผ์ ์ ๊ทธ๋ฆผ์ ํตํด ์์๋ณด์!!
- ํ๋์ ๋ฌธ์์ดb์ ๋ฌธ์ ํ๋ํ๋๋ฅผ ๋ ๋๋ง๋ค ๋ฌธ์์ดa ์ ์ฒด๋ฅผ ํ์ธํ๋ค.
- ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ํด๋น ๊ธ์๊ฐ ์๊ธฐ ์ ์ LCS ๊ฐ + 1๋ก dp ๊ฐ์ ์ ๋ฐ์ดํธ ํ๋ค.
- ๋ฌธ์๊ฐ ์๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ, ๊ทธ ์ํฉ์์์ ์ต๋ LCS ๊ฐ์ dp์ ์ ์ฅํ๋ค.
์ด์ ์ฝ๋๋ฅผ ํตํด์ ์ ๊ณผ์ ์ ๋ ์์ธํ ์ดํด๋ณด์!
str1 = input()
str2 = input()
matrix = [[0]*(len(str2)+1) for _ in range(len(str1)+1)]
for i in range(1, len(str1)+1):
for j in range(1, len(str2)+1):
if str1[i-1] == str2[j-1]:
matrix[i][j] = matrix[i-1][j-1] + 1
else:
matrix[i][j] = max(matrix[i][j-1], matrix[i-1][j])
print(matrix[-1][-1])
๋๊ธ๋จ๊ธฐ๊ธฐ