문제 : https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
표로 나타내보면 더 쉽게 확인할 수 있다.
import java.util.* import kotlin.math.max var str1 ="" var str2 ="" lateinit var dp : Array<Array<Int>> fun main() = with(Scanner(System.`in`)){ str1 = nextLine() str2 = nextLine() var max = 0 dp = Array(str2.length+1){Array(str1.length+1){0} } for(i in str2.indices){ find(i) } for(i in 0 until str2.length+1){ for(j in 0 until str1.length+1){ // print("${dp[i][j]} ") max = max(dp[i][j],max) } // println() } println(max) } fun find(twoIndex: Int){ for(oneIndex in str1.indices){ if(str1[oneIndex] == str2[twoIndex]){ dp[twoIndex+1][oneIndex+1] = dp[twoIndex][oneIndex]+1 } else{ dp[twoIndex+1][oneIndex+1] = max(dp[twoIndex][oneIndex+1],dp[twoIndex+1][oneIndex]) } } }
주석처리된 print부분을 사용하면 dp의 내부를 확인할 수 있다.
참고
https://velog.io/@emplam27/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-LCS-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Longest-Common-Substring%EC%99%80-Longest-Common-Subsequence