๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9251
๐ ๋ฌธ์ ์์ฝ
- ๋ ๋ฌธ์์ด str1๊ณผ str2๊ฐ ์ฃผ์ด์ก์ ๋, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS: Longest Common Subsequence)์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
- LCS๋ ์ฐ์๋์ง ์์๋ ๋จ -> ์์๋ง ์ ์งํ๋ฉด ๋จ.
- ACAYKP, CAPCAK์์๋ `ACAK`๊ฐ LCS
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
- dp[i][j] ์ ์
- dp[i][j]: `str1[0:i]`์ `str2[0:j]`์ LCS ๊ธธ์ด.
- ์ ํ์ (DP)
- ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด `dp[i][j] = dp[i-1][j-1] + 1`
-> ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด ์ด์ LCS ๊ธธ์ด์ 1์ฆ๊ฐ.
- ๋ฌธ์๊ฐ ๋ค๋ฅด๋ฉด `dp[i][j] = max(dp[i-1][j], dp[i][j-1])`
-> ์ด์ ๋ฌธ์์ด ์ค ๋ ๊ธด LCS๋ฅผ ์ ์ง.
- ๊ฒฐ๊ณผ ์ถ๋ ฅ
- dp[n][m]์ ์ถ๋ ฅ (`n = str1.length(), m = str2.length()`).
๐ก ์ฝ๋
public class Baekjoon_9251 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
int n = str1.length();
int m = str2.length();
int[][] dp = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
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]);
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- O(NM)
- N ≤ 1000, M ≤ 1000 → ์ต์
์ ๊ฒฝ์ฐ 1,000,000