오답 여부: o

편집 시간: 2022년 2월 24일 오후 6:02

코드

Algorithm/9251.py at main · Junroot/Algorithm

풀이

잘못된 풀이

문자열 하나에 대한 dp로 접근했다. 첫번째 문자열로 dp를 한다면 아래와 같이 접근할 수 있었다.

f(x): x번째 문자열을 마지막으로 가지는 str2과의 (LCS, 마지막으로 사용한 index)

f(n) = max( f(m) ) + 1 {m | m은 정수, 0 ≤ m < n, f(n)의 index > f(m)의 인덱스}

max는 LCS가 같다면 마지막으로 사용한 index가 더 작은 것을 우선으로.

하지만 이 방식에는 예외가 있었다.

f(m) 중에서 가장 긴 부분 수열을 선택하면 index가 너무 뒤로가서 최종 LCS가 되지 못한다는 문제가 있었다. 아래의 테스트 케이스에서 실패한다.

SKDFHWEODJKSFSDFJK
WKJSDHFOWEFKJDVKSDF

맞는 풀이

두 문자열에대해서 모두 dp로 접근해야된다.

f(n, m): n길이의 str1과 m길이의 str2의 LCS

f(n, m) = max( f(n-1, m), f(n, m-1) ) → str1[n] ≠ str2[m] 인 경우

f(n, m) = f(n-1, m-1) + 1 → str1[n] == str2[m] 인 경우