๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.9251 LCS ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/9251
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋
๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ์ ๊ทผ๋ฒ
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด) ๋ฌธ์ ์ ๋๋ค.
์์ด ๋ฌธ์ ์ ์ ํ ์ค ํ๋ ์ ๋๋ค.
๊ฐ ๋ฌธ์์ด์ ๋ถ๋ถ์งํฉ๋ค์ ๋น๊ตํด ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ์์ด์ ์ฐพ๋ ๋ฌธ์ ์ ๋๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ ๋ถ๋ถ์งํฉ๋ค์ ๋ํด ์์ ๊ฐ์ด ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์ ํ์์ ์ฐพ์ ์ ์์ต๋๋ค.
word1 ๋ฌธ์์ด์ i๋ฒ์งธ ๋ฌธ์์ word2 ๋ฌธ์์ด์ j๋ฒ์งธ ๋ฌธ์๊ฐ ๊ฐ์ ๋ฌธ์์ผ ๋ => word1.charAt(i)==word2.charAt(j)
word1์ i-1๋ฒ์งธ๊น์ง์ ๋ฌธ์์ด๊ณผ word2์ j-1๋ฒ์งธ๊น์ง์ ๋ ๋ฌธ์์ด ๊ฐ์ LCS ๊ธธ์ด๊ฐ 1์ด ์ฆ๊ฐํฉ๋๋ค.
// word1.charAt(i-1)==word2.charAt(j-1) ๋ฌธ์์ด์ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ!
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
}
์๋ํ๋ฉด word1์ i-1๋ฒ์งธ๊น์ง์ ๋ฌธ์์ด๊ณผ word2์ j-1๋ฒ์งธ๊น์ง์ ๋ ๋ฌธ์์ด ๊ฐ์ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ธธ์ด๊ฐ x ์ผ๋
word1์ i๋ฒ์งธ ๋ฌธ์์ word2์ j๋ฒ์งธ ๋ฌธ์๊ฐ ๋์ผํ๋ฉด ๊ทธ ์ ๊น์ง์ ๊ณตํต ๋ถ๋ถ ์์ด์ ๊ณตํต ๋ฌธ์ ํ๋๊ฐ ๋ ์ถ๊ฐ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ณตํต ๋ถ๋ถ ์์ด์ ๊ธธ์ด 1 ์ฆ๊ฐ => dp[i][j] = dp[i-1][j-1]+1
๋๋จธ์ง ๊ฒฝ์ฐ์ธ word1 ๋ฌธ์์ด์ i๋ฒ์งธ ๋ฌธ์์ word2 ๋ฌธ์์ด์ j๋ฒ์งธ ๋ฌธ์๊ฐ ๋ค๋ฅธ ๋ฌธ์์ผ ๋๋
ํ ์ด๋ธ์ ๋ฐ๋ก ์ ์ด์ ๊ณตํต ๋ถ๋ถ ์์ด ๊ธธ์ด์ dp[i][j-1] ํ ์ด๋ธ์ ๋ฐ๋ก ์ ํ์ ๊ณตํต ๋ถ๋ถ ์์ด ๊ธธ์ด dp[i-1][j] ๋ฅผ ๋น๊ตํด ๋ ๊ธด ๊ธธ์ด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
๐ป ์ฝ๋
package problem.dynamic;
import java.io.*;
public class Main_9251 {
static int dp[][];
static StringBuilder sb;
static String word1;
static String word2;
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
sb = new StringBuilder();
solve();
bw.flush();
bw.close();
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
word1 = br.readLine();
word2 = br.readLine();
dp = new int[word1.length()+1][word2.length()+1];
br.close();
}
public static void solve() {
for(int i = 0; i <= word1.length(); i++)
dp[i][0] = 0;
for(int i = 0; i <= word2.length(); i++)
dp[0][i] = 0;
for(int i=1; i<=word1.length(); i++){
for(int j=1; j<=word2.length(); j++){
// word1.charAt(i-1)==word2.charAt(j-1) ๋ฌธ์์ด์ ์ธ๋ฑ์ค๊ฐ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ!
if(word1.charAt(i-1)==word2.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[word1.length()][word2.length()]);
}
}