문제
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 | 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 |