
๐ ๋ฌธ์ ๋ณด๊ธฐ - [๋ฐฑ์ค] LCS
LCS(Longest Common Subsequence, ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด)๋ฌธ์ ๋ ๋ ์์ด์ด ์ฃผ์ด์ก์ ๋, ๋ชจ๋์ ๋ถ๋ถ ์์ด์ด ๋๋ ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ACAYKP์ CAPCAK์ LCS๋ ACAK๊ฐ ๋๋ค.
์ฒซ์งธ ์ค๊ณผ ๋์งธ ์ค์ ๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์ต๋ 1000๊ธ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ฒซ์งธ ์ค์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ LCS์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String firstLine = br.readLine();
String secondLine = br.readLine();
int[][] arr = new int[firstLine.length() + 1][secondLine.length() + 1];
for(int i = 1; i <= firstLine.length(); i++) {
for(int j = 1; j <= secondLine.length(); j++) {
if(firstLine.charAt(i - 1) == secondLine.charAt(j - 1)) {
arr[i][j] = arr[i-1][j-1] + 1;
} else {
arr[i][j] = Math.max(arr[i-1][j], arr[i][j-1]);
}
}
}
System.out.println(arr[firstLine.length()][secondLine.length()]);
}
}
LCS๋ฅผ ํธ๋ ๋ฌธ์ ์ธ๋ฐ ์ ํด๋ณด์ง ์์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ์ด์ผํ ์ง ๊ฐ์ด ์กํ์ง ์์ ์๋ ์ฃผ์์์ ์ฐธ๊ณ ํ์ฌ DP ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
ํ๋ฒ ์์๋๋ฉด LCS๊ฐ ๋์ค๋ ๋ฌธ์ ๋ค์ ํ๋ ์ข๋ ์๊ฐ์ ํ์ฅํ์ฌ ํ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์ง๊ธ๊น์ง์ ์ต๋ ๊ณตํต ๋ถ๋ถ์์ด์ธ arr[i-1][j-1]์ 1์ ๋ํด์ค ๊ฐ์ ์
๋ ฅํด์ฃผ๊ณ ,'ํ์ฌ์ ๋ฌธ์๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ' ์ด์ ์ ๊ณผ์ ์ธ ๋ฐฐ์ด์ arr[i-1][j] ํน์ arr[i][j-1] ์ค ํฐ ๊ฐ์ ์
๋ ฅํด์ค๋๋ค.