bong-u/til

백준 - 9252 : LCS 2 (G4)

수정일 : 2024-11-15

 1S1 = list(input())
 2S2 = list(input())
 3
 4N1 = len(S1)+1
 5N2 = len(S2)+1
 6
 7dp = [[0]*(N1) for _ in range(N2)]
 8
 9for i in range(1, N2):
10    for j in range(1, N1):
11        if S2[i-1] == S1[j-1]:
12            dp[i][j] = dp[i-1][j-1] + 1
13        else:
14            dp[i][j] = max(dp[i-1][j], dp[i][j-1])
15i = N2-1
16j = N1-1
17print (dp[i][j])
18if dp[i][j] == 0:
19    exit()
20
21result = ''
22while True:
23    if i==0 or j==0:
24        break
25
26    if dp[i][j] == dp[i-1][j]:
27        i -= 1
28    elif dp[i][j] == dp[i][j-1]:
29        j -= 1
30    else:
31        result = S1[j-1] + result
32        i -= 1
33        j -= 1
34
35print (result)
  1. 점화식을 잘못 세웠었다
    • 문자가 같은 경우에 max(dp[i-1][j], dp[i][j-1])+1이 아닌 dp[i-1][j-1]+1이다.
  2. LCS 구하는 것을 인터넷에서 참고하였다
    • 오른쪽끝에서 시작하여 현재 dp 값이랑 같은 쪽으로 옮긴다
    • 현재 dp 값이랑 같은 것이 없으면 문자를 저장하고 대각선 위로 올라간다