๋ฐฑ์ค 9251 ํ์ด์ฌ - LCS - ๋์ ๊ณํ๋ฒ
๋ฐฑ์ค 9251 ํ์ด์ฌ
https://www.acmicpc.net/problem/9251
์ด๋ฒ ๋ฌธ์ ๋ ๋๊ฐ์ ๋ฌธ์์ด์ด ์ฃผ์ด์ก์ ๋ LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ค.
์๋ฅผ ๋ค์ด
ACAYKP
CAPCAK
LCS๋ ACAK ์ด๋ค.
์ด์ ์ ํ์๋ ๋์ ๊ณํ๋ฒ์ด๋์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ 2์ฐจ์ ๋ฐฐ์ด์ ์บ์๋ฅผ ๋ง๋ค์ด์ ํด๊ฒฐํ ์ ์๊ณ ... ๋์ ๊ฐ์ ๊ตฌํด์ ํด๊ฒฐํ ์๋ ์๋ค.
Python ํ์ด 1
ํด๋น ํ์ด๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ ๋์ ๊ณํ๋ฒ์ด๋ค.
2์ฐจ์ ๋ฐฐ์ด์ ์บ์๊ฐ์ ๋ง๋ค์ด ๋์ ๊ณํ๋ฒ์ผ๋ก ํ๋๋ 2๊ฐ์ ๋ฌธ์์ด์ ํ์ฌ ์์ ์์ LCS ๊ฐ์ ๊ตฌํ๋ ์๋ฆฌ๋ค. ๋ฐฐ์ด์ ์ฑ์ฐ๊ธฐ ์ํด ๋ฌธ์์ด์ ์ํ๋ฒณ์ ์ํํ ๋... ๋ง์ฝ ๊ฐ์ ์ํ๋ฒณ์ธ ๊ฒฝ์ฐ ํด๋น ์์น์์๋ ๊ธ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ LCS ๊ฐ๋ณด๋ค 1์ ๋ํด์ ์ ์ฅํ๋ค. ์ด์ค for๋ฌธ์ผ๋ก i, j๋ฅผ ์ฌ์ฉํ์ ๋ ์์น๊ฐ [i-1][j-1]์ ์์น์ด๋ค. ๋ง์ฝ ์ํ๋ฒณ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ... ์ด์ ๊น์ง ๋น๊ตํ ๊ฐ์ค ์ต๋๊ฐ์ ๊ตฌํด์ผํ๋ค. ์๋ฅผ ๋ค์ด... CAP์ ACA๋ฅผ ๋น๊ตํ ๋ ๋ง์ง๋ง ๊ธ์์ธ P์ A๋ ์๋ก ๋ค๋ฅด๋ค. ๊ทธ๋์ ์ด์ ๊น์ง ๊ตฌํ ๊ฐ... CAP, AC = 1 ๊ทธ๋ฆฌ๊ณ CA, ACA = 2 ๋๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์ด์ค ์ต๋๊ฐ์ด CAP์ ACA๊น์ง์ LCS๊ฐ ๋ ๊ฒ์ด๋ค.
import sys
read = sys.stdin.readline
word1, word2 = read().strip(), read().strip()
h, w = len(word1), len(word2)
cache = [[0] * (w+1) for _ in range(h+1)]
for i in range(1, h+1):
for j in range(1, w+1):
if word1[i-1] == word2[j-1]:
cache[i][j] = cache[i-1][j-1] + 1
else:
cache[i][j] = max(cache[i][j-1], cache[i-1][j])
print(cache[-1][-1])
- ์ด์ ๊ฐ์ ๊ฐ๊ณ ํ๊ธฐ ๋๋ฌธ์ ๊ธ์์ ํฌ๊ธฐ๋ณด๋ค 1๋์ฉ ํฌ๊ฒ cache๋ฐฐ์ด์ ์ง์ ํ๋ค.
- ๊ธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ์ด์ ๊ฐ์์ 1์ ๋ํ๊ณ ๊ธ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ 2๊ฐ์ง ๊ฒฝ์ฐ์ ์์์ ์ต๋๊ฐ์ ์ ์ฅํ๋ค.
- ์ต์ข ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ง์ง๋ง ๊ฐ์ด ๋ต์ด ๋๋ค.
์ฃผ์ํด์ผํ ๊ฒ์ด ์๋ค๋ฉด... ๊ฐ๊ฐ ๊ธ์์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ธ์์ index๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํด์ค์ผํ๋ค.
Python ํ์ด 2
๋๋ฒ ์งธ ํ์ด๋ ๋์ ๊ณํ๋ฒ์ด๊ณ 2์ค for๋ฌธ์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ ๊ฐ๋ค. ๊ทธ๋ฌ๋ cache๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ์ง์ ํ ์ ์์ด ํ์ด 1์์ 2์ฐจ์ ๋ฐฐ์ด์ ์ํํ๋๋ฐ ๋ค์ด๊ฐ๋ ์๊ฐ์ ์ค์ผ ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ์ ์ฝ๋๊ณ ์๊ฐ๋ ๋๋ต 2.5๋ฐฐ์ ๋ ๊ฐ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค.
๊ธ์ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ ๊ฐ์ ๊ธ์๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ๋์ ๊ฐ์์ 1์ ๋ํ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด๋ค. ์ํํ ๋๋ง๋ค ๋์ ๊ฐ์ ์ ์ฅํ ๋ณ์๋ฅผ ํ๋ ์ฌ์ฉํ๊ณ ๋ง์ฝ ๊ธ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ๋์ ๋ณ์์ ๊ฐ์ด ํด๋น ์์น์ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก ๊ต์ฒดํด์ค๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋์ ๊ฐ์๋ ์ด์ ์์น๊น์ง ๊น์ง์ ์ต๋๊ฐ์ด ๊ณ์ํด์ ์ ์ฅ๋๋ค.
import sys
read = sys.stdin.readline
word1, word2 = read().strip(), read().strip()
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))
- cnt๋ฅผ ๋์ ๋ณ์๋ก ์ฌ์ฉํ๋ค.
- ๋์ ๋ณ์์ ๊ฐ์ด ์บ์๊ฐ๋ณด๋ค ์์ผ๋ฉด ๊ต์ฒดํ๋ค.
- ๊ธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋์ ๋ณ์์์ 1์ ๋ํ๋ค.
์ฃผ์ํด์ผํ ์ฌํญ์... ๋์ ๋ณ์์ ๊ฐ์ด ํด๋น ์์น์ ์บ์๊ฐ๋ณด๋ค ์์์ง ์ฌ๋ถ๋ถํฐ ํ์ธํด์ผํ๋ค.
XXXXXF
XFXXXQ
๋ฐ๋ก๋ก ์ด ๋ ๋ฌธ์์ด์ ์์๋ก ํ์๋ ๋ง์ฝ ๊ธ์๊ฐ ๊ฐ์์ง๋ฅผ ๋จผ์ ๋น๊ตํด๋ฒ๋ฆฌ๋ฉด... ๋์ ๊ฐ์ด ์ถ๊ฐ ๋์ง ์๋๋ค.