coding test

[파이썬] 9251. LCS

잔망루피 2023. 3. 6. 19:47

문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

예제 입력 1 

ACAYKP
CAPCAK

예제 출력 1 

4

 

 

🌱 나의 풀이

import sys
input = sys.stdin.readline

a = input().rstrip()
b = input().rstrip()

len_a = len(a)
len_b = len(b)
dp = [[0] * (len_a + 1) for _ in range(len_b + 1)]

if len_a * len_b == 0 :
    print(0)
else :
    for i in range(1, len_b + 1) :
        for j in range(1, len_a + 1) :
            if a[j-1] == b[i-1] :
                dp[i][j] = dp[i-1][j-1] + 1
            else :
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    print(dp[-1][-1])
  A C A Y K P
C 0 1 1 1 1 1
A 1 1 2 2 2 ✅ 2 
P 1 1 2 ✅ 2 3(=2 + 1)
C 1 2 ✅ 2 2 2 3
A 2 2 3 3 3 3
K 2 2 3 3 4 4

같은 문자열을 발견하면, 이전 dp 값 dp[i-1][j-1] + 1

그렇지 않으면, max(dp[i-1][j], dp[i][j-1])

 

 

# 틀렸습니다
import sys
input = sys.stdin.readline

a = input()
b = input()

len_a = len(a)
len_b = len(b)
dp = [[0] * (len_a + 1) for _ in range(len_b + 1)]

if len_a * len_b == 0 :
    print(0)
else :
    for i in range(1, len_b + 1) :
        for j in range(1, len_a + 1) :
            if a[j-1] == b[i-1] :
                dp[i][j] = dp[i-1][j-1] + 1
            else :
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    print(dp[-1][-1])

 

 

📌 다른 사람 풀이

# https://myjamong.tistory.com/317
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))

메모리를 효율적으로 쓰는 방법같다.

 

# https://myjamong.tistory.com/317
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])

 

나처럼 DP로 풀었다.

 

 

 

 

문제 출처 👇

백준

반응형

'coding test' 카테고리의 다른 글

[파이썬] 17822. 원판 돌리기  (0) 2023.03.16
[파이썬] 16235. 나무 재테크  (0) 2023.03.11
[파이썬] 16940. BFS 스페셜 저지  (0) 2022.12.04
[파이썬] 1167. 트리의 지름  (0) 2022.11.19
[파이썬] 11047. 동전 0  (0) 2022.11.15