본문 바로가기

알고리즘/백준

[백준] 9252번 : LCS2

728x90

https://www.acmicpc.net/problem/9252

 

9252번: LCS 2

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

www.acmicpc.net

이 문제를 풀기전 아래의 문제를 먼저 이해해야 합니다.

https://bigkwangs.tistory.com/18

 

[백준] 9251번 : LCS

https://www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYK

bigkwangs.tistory.com

 

본론으로 돌아가서 LCS2는 모두의 부분수열중 가장 긴 수열을 찾는 문제이다.

LCS 문제를 이전에 풀었더라면 dp 테이블을 역으로 추적을 잘 생각해보면 문제를 해결 할 수 있다.

문자열 인덱스 i,j가 있다고 하면 

1. str1[i]==str2[j]가 같은경우는 dp[i][j] = dp[i-1][j-1]

2. 그렇지 않은경우 dp[i][j] = max(dp[i-1][j], dp[i][j-1] )

위의 조건을 역추적하여 아래의 그림과 같이 A,C,A,K를 역 추적 할 수 있다.

 

최종 결과값을 reverse 하여 출력

str1 = str(input())
str2 = str(input())
length1 = len(str1)
length2 = len(str2)
dp = [[0 for _ in range(length2+1)] for _ in range(length1+1)]

for i in range(1, length1+1):
    for j in range(1, length2+1):
        if str1[i-1] == str2[j-1]:
            dp[i][j] = dp[i-1][j-1] + 1
        else:
            dp[i][j] = max(dp[i-1][j], dp[i][j-1])

arr = ''
count = 1
maxdp = dp[length1][length2]
print(maxdp)
i = length1
j = length2
while i >= 0 and j >= 0:
    if dp[i-1][j] == dp[i][j]:
        i -= 1
    elif dp[i][j-1] == dp[i][j]:
        j -= 1
    else:
        arr += str1[i-1]
        j -= 1
        i -= 1

reversechar = ''
for i in range(len(arr)-1, -1, -1):
    reversechar += arr[i]
    
print(reversechar)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1753번 : 최단경로  (0) 2023.07.15
[백준] 1520번 : 내리막길  (2) 2023.07.15
[백준] 2156번 : 포도주 시식  (0) 2023.07.14
[백준] 1010번 : 다리 놓기  (0) 2023.07.13
[백준] 9251번 : LCS  (0) 2023.07.13