반응형
https://www.acmicpc.net/problem/9251
혼자 힘으로 풀었는가? X
알고리즘 분류
- 다이나믹 프로그래밍
- 문자열
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
문제는 딱봐도 DP문제였다.
진짜 문제는 내 구현 실력이었다.
일단 반복문을 두 번 돌려야 한다는 건 알겠다.
하지만 이를 DP의 메모이제이션 방법으로 구현할 방법이 도저히 떠오르지 않았다.
import sys
input = sys.stdin.readline
s1 = input().rstrip()
s2 = input().rstrip()
dp = [[0] * (len(s2)+1) for _ in range(len(s1)+1)]
for i in range(1, len(s1)+1):
for j in range(1, len(s2)+1):
if s1[i-1] == s2[j-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[len(s1)][len(s2)])
예제를 예로들면
ACAYKP
CAPCAK
첫 번째 문장과 두 번째 문장 둘 다 전부 다 비교를 하긴 하겠지만
이중 for문으로 첫 번째 문장 기준 두 번째 문장을 확인하기 위해
dp = [[0] * (len(s2)+1) for _ in range(len(s1)+1)]
s2의 길이로 초기화한 배열을 s1의 길이 개수만큼 만들어 2차원 DP배열을 만들어 준다.
이후 반복문을 수행하면
0 0 0 0 0 0 0
0 0 1 1 1 1 1
0 1 1 1 2 2 2
0 1 2 2 2 3 3
0 1 2 2 2 3 3
0 1 2 2 2 3 4
0 1 2 3 3 3 4
위와 같은 DP테이블이 만들어진다.
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1]+1
같은 문자를 발견하면 그전까지의 문자 +1을
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
다를 경우 s1과 s2 중 더 긴 중복 문자 중 큰 수를 가져다가 DP테이블을 채워준다.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 1759번 - 암호 만들기 (골드 5) (0) | 2023.08.23 |
---|---|
[Python] 백준 15686번 - 치킨 배달(골드 5) (1) | 2023.08.21 |
[Python] 백준 12865번 - 평범한 배낭 (골드5) (0) | 2023.08.19 |
[Python] 백준 2447번 - 별 찍기 - 10 (골드5) (0) | 2023.08.18 |
[Python] 백준 5014번 - 스타트링크 (실버1) (0) | 2023.08.17 |
댓글