문제 링크
https://www.acmicpc.net/problem/1958
시간 제한 : 2초
메모리 제한 : 128 MB
문제 요약
- LCS(Longest Common Subsequence) : 최장 공통부분 수열. 주어진 여러개의 수열 모두의 부분수열이 되는 수열들 중 가장 긴 것.
- 문제 : 문자열 3개의 LCS(Longest Common Subsequence)의 길이를 출력하여라.
입력
예제 입력 1
abcdefghijklmn
bdefg
efg
출력
예제 출력 1
3
풀이
"세 문자열의 문자를 하나하나 차례대로 모두 비교하고, 문자가 동일하다면 해당 인덱스에는 이전까지 기록된 최장 길이값에 +1을 하자!"
import sys
input = sys.stdin.readline
seq_1 = input().rstrip() # rstrip() : 문자열 오른쪽의 공백 제거.
seq_2 = input().rstrip()
seq_3 = input().rstrip()
x = len(seq_1)
y = len(seq_2)
z = len(seq_3)
# 문자열 길이의 +1을 해주는 이유는, 이전 인덱스의 값과 비교해야 하기 때문이다.
arr = [[[0] * (z + 1) for _ in range(y + 1)] for _ in range(x + 1)]
for i in range(1, x + 1):
for j in range(1, y + 1):
for k in range(1, z + 1):
if seq_1[i - 1] == seq_2[j - 1] and seq_2[j - 1] == seq_3[k - 1]:
arr[i][j][k] = arr[i - 1][j - 1][k - 1] + 1
else:
# 세 문자열의 문자끼리 비교하였을 때 같지 않다면, 이전까지 기록된 가장 긴 최장 수열의 값을 기록하여 최신화한다.
arr[i][j][k] = max(arr[i][j][k - 1], arr[i][j - 1][k], arr[i - 1][j][k])
ans = -1
for i in range(x + 1):
for j in range(y + 1):
ans = max(max(arr[i][j]), ans)
print(ans)
참고
https://www.acmicpc.net/problem/1958
'알고리즘 공부' 카테고리의 다른 글
[백준] 1525번 - 퍼즐 / 골드 2 / 파이썬 풀이 (0) | 2022.02.28 |
---|---|
[백준] 1202번 - 보석 도둑 / 골드 2 / 파이썬 풀이 (0) | 2022.02.24 |
[백준] 1507번 - 궁금한 민호 / 골드 3 / 파이썬 풀이 (0) | 2022.01.31 |
[백준] 2252번 - 줄 세우기 / 골드 3 / 파이썬 풀이 (0) | 2022.01.23 |
[백준] 9935번 - 문자열 폭발 / 골드4 / 파이썬 풀이 (0) | 2022.01.12 |
최근댓글