최장 공통 부분 수열 LCS를 구현하는 문제이다
LCS 개념은 이분이 굉장히 잘 설명해 두셨음
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence
LCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.
velog.io
첫 번째 문자열과 두 번째 문자열의 길이를 각각 가로, 세로로 두고 2차원 배열을 만든다
이중 for문을 돌면서 문자열의 원소를 비교한다
(두 번째 문자열의 i번째 문자에 대해 첫 번째 문자열과 전부 비교한다)
첫 번째 문자열의 i번째, 두 번째의 문자열의 j번째를 비교했을 떄
1. 두 문자열이 같은 경우
- dp[i-1][j-1] 값에 1을 더한 값으로 입력한다
- 부분 수열의 특징은 연속되지 않아도 되기 때문에, 계속 누적해서 부분수열 길이를 가지고 있음
- 현재 비교 값이 같다는 의미는 누적 길이에 1이 늘어난다는 뜻
- 현재 비교 하고 있는 원소의 이전 값에 저장된 부분 수열에 길이에 1을 더해줌
2. 다른 경우
- dp[i-1][j], dp[i][j-1] 중에 max 값을 고른다
- 마찬가지로 부분 수열의 누적 길이를 가지고 있기 때문에, 이전에 저장된 값 중에 max 값을 연장해주는 것
a = list(input().strip())
b = list(input().strip())
al = len(a)
bl = len(b)
arr = [[0 for _ in range(al+1)] for _ in range(bl+1)]
for i in range(1,bl+1):
for j in range(1,al+1):
if a[j-1]==b[i-1]:
arr[i][j]=arr[i-1][j-1]+1
else:
arr[i][j]=max(arr[i-1][j],arr[i][j-1])
print(arr[bl][al])
'개발자 강화 > 코딩 테스트' 카테고리의 다른 글
[백준] 1520 내리막길 / DP / Python / 골3 (1) | 2024.11.21 |
---|---|
[백준] 10942 팰린드롬? / DP / Python / 골4 (1) | 2024.11.20 |
[백준] 1915 가장 큰 정사각형 DP / python 골4 (1) | 2024.11.20 |
[백준] 1로 2만들기 2 / DP python 실1 (1) | 2024.11.19 |
[백준] 2457 공주님의 정원 greedy python 골3 (1) | 2024.11.18 |