1. ๋ฌธ์ ์ค๋ช
๋ฌธ์์ด์ด ๋ ๊ฐ ์ฃผ์ด์ก์ ๋, ๋ ๋ฌธ์์ด์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ตฌํ์ฌ๋ผ
2. ๋ฌธ์ ํธ๋ ์๋ฆฌ ์ค๋ช
๋ถ๋ถ ์์ด์ ๋ณธ ์์ด์์์ ์ซ์์ ์์๋ฅผ ์งํค๋ ํ๋์ ์ด์ด์ด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด 0์ด ์๋ ์์ ์ ์๋ผ๋ ์์ด์ด ์๋ค๊ณ ํ์. (1, 2, 3, 4, 5, 6, 7, …) ์ง์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ ํด๋น ์ ์์ ์์๋ฅผ ์งํค๋ฏ๋ก 0์ด ์๋ ์์ ์ ์์ ๋ถ๋ถ ์์ด์ด๋ค. (2, 4, 6, 8. 10, …) ๋ฐ๋ผ์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ด๋ผ๋ฉด, ๋ ๋ฌธ์์ด์์ ๊ณตํต์ผ๋ก ์์๊ฐ ๊ฐ์ ๋ฌธ์์ ์ด ์ค ๊ฐ์ฅ ๊ธด ๋ฌธ์์ด์ ์ฐพ์ผ๋ฉด ๋๋ค. ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ์ฐพ๊ธฐ ์ํด DP๋ฅผ ์ด์ฉํด๋ณด๊ฒ ๋ค.
์ฒซ ๋ฒ์งธ ๋ฌธ์์ด str1(๊ฐ๋ก) = “ACAYKP”์ด๊ณ , ๋ ๋ฒ์งธ ๋ฌธ์์ด str2(์ธ๋ก) = “CAPCAK”์ผ ๋, ํ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค. ๋จผ์ ํ๋์ ํ์ด๋ผ์ดํธ๊ฐ ๋ง๋ฟ์ ์ ์ ์๋ฏธ๋ ๋ฌธ์์ด “C”์ ๋ฌธ์์ด “AC”์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ด๋ค. ์ด๋๋ ‘C’ ํ๋๋ง ์กด์ฌํ๋ฏ๋ก ๋ต์ 1์ด๋ค. ๋ ๋ฒ์งธ ์ฃผํฉ์์ด ๋ง๋ฟ์ ๋ถ๋ถ์ ๋ฌธ์์ด “ACAY”์ “CAPC”์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ฐ์ด๋ค. ์ด๋๋ ‘C’์ ‘A’๊ฐ ์ฐ์๋ ๊ณตํต ๋ถ๋ถ์ด๋ฏ๋ก “CA”๊ฐ ๊ณตํต ๋ถ๋ถ ์์ด์ด๊ณ ๋ต์ 2์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ํ๋ ์ด๋ค ์ ํ์์ผ๋ก ๊ตฌํ ์ ์์๊น?
์ ํ์ ์ค๋ช
๋ฌธ์์ด “ACA”(๊ฐ๋ก)์ “CAPCA”(์ธ๋ก)๋ฅผ ๋ค์ด ์ค๋ช ํ๊ฒ ๋ค. ํด๋น ๋ฌธ์์ด๋ค์ ๊ณตํต ์ต์ฅ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ (3,5) ํ๋ ฌ์ ๊ฐ์ฒ๋ผ 3์ด๋ค. “ACA”๋ก ์๋ก ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋์ ์ ๋ฌธ์์ด์ ์๊ฐํด๋ณด์. ๊ฐ๊ฐ “AC”์ “CAPC”์๋ค. ์ด๋, ๊ณตํต ์ต์ฅ ๋ถ๋ถ ์์ด์ ๊ฐ์ “AC” ์ด๋ค. ๋ ๋ค ๋ง์ง๋ง์ ์๋ก์ด ๋ฌธ์์ด์ด ์ถ๊ฐ ๋๋ฉด์ ๊ณตํต ์ต์ฅ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ 1 ์ฆ๊ฐ ํ์๋ค. ๋ฐ๋ผ์ ๋ง์ฝ ๊ณตํต ๋ฌธ์๊ฐ ํ๋ ์๊ธด๋ค๋ฉด ์ ํ์์ dp[x][y] = dp[x-1][y-1] +1 ์์ ์ ์ ์๋ค. (dp[x-1]์ dp[x]์์ ๋ง์ง๋ง ๋ฌธ์ ํ๋๊ฐ ๋น ์ง ๋ฌธ์์ด์ ๋ํ๋.) ๋ง์ฝ ๋ ๋ฌธ์์ด์ ๋์ ์๋ก์ด ๋ฌธ์๊ฐ ์ถ๊ฐ ๋์์ง๋ง ๊ณตํต ๋ถ๋ถ ์์ด์ด ๋์ง ์์ ๊ฒฝ์ฐ dp์ ๊ฐ์ ์ด๋ป๊ฒ ๋ ๊น? ์ด๋ dp[x][y] = MAX(dp[x-1][y], dp[x][y-1]) ์ด๋ค. ์๋ฅผ ๋ค์ด ์ค๋ช ํ๊ฒ ๋ค. ํ๋ ฌ[3,3]์ ์๋ก ๋ค๋ฉด, “CAP”์ “ACA”์ ์ต์ฅ ๊ณตํต๋ถ๋ถ์์ด์ “CA”์ธ๋ฐ ์ด๋ “CA”์ “ACA”์ ์ต์ฅ ๊ณตํต๋ถ๋ถ์์ด๊ณผ๋ ๊ฐ๋ค. ๋ฐ๋ผ์ “CAP”์ “ACA”๋ฅผ ๋น๊ตํ ๋ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ฌธ์์ธ P์ A๊ฐ ์๋ก ๊ฐ์ง ์์ผ๋ฉด, “CAP”์ “AC”, “CA”์ “ACA”์ ์ต์ฅ ๊ณตํต๋ถ๋ถ ์์ด ์ค ๋ ํฐ ๊ฐ์ด ๊ณ์ ๋ต์ต๋๋ ๊ฒ์ด๋ค.
3. ์ฝ๋ ๋ถ์
์์ ์ค๋ช ์ ๊ทธ๋๋ก ์ฝ๋ํ ํ ๊ฒ์ด๋ผ ๋ฐ๋ก ์ค๋ช ์ ์๋ค. dp๋ฌธ์ ๋ ์์ด๋์ด ๋์ถ์ด ์ด๋ ต์ง ์ฝ๋ ์ง๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค๋ ๊ฒ์ ๋ค์ ํ๋ฒ ๋๋๋ค.
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char [] strArr1 = br.readLine().toCharArray();
char [] strArr2 = br.readLine().toCharArray();
int N = strArr1.length;
int M = strArr2.length;
int [][] dp = new int[N+1][M+1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if(strArr1[i-1] == strArr2[j-1] && dp[i][j-1] < i){
dp[i][j] = dp[i-1][j-1] +1;
}
else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
System.out.println(dp[N][M]);
}
}