CS/알고리즘
백준 9251번 : LCS[java]
leejiwoo21
2023. 2. 22. 16:47
1. 첫 번째 문자열(s1)과 두 번째 문자열(s2)를 입력받는다.
2. dp에 사용할 배열 dp[1001][1001]을 만든다.
ㄴ dp[i][j]는 s1의 i번째와 s2의 j번째 문자까지 비교했을 때 최장 공통 부분수열이다.
3. s1의 i번째 문자와 s2의 j번째 문자를 비교하고 같다면 dp[i][j] = dp[i-1][j-1] +1 이고,
→ s1의 i번째 문자와 s2의 j번째 문자를 이번 dp[i][j]에서 공통 문자로 사용했기 때문에 직전까지의 최댓값에 +1을 한다.
4. s1의 i번째 문자와 s2의 j번째 문자를 비교하고 다르다면 dp[i][j] = max(dp[i-1][j] , dp[i][j-1]) 이다.
→ i번째 문자와 j번째 문자가 다르기 때문에 직전 문자열에 각각 추가하여 비교한 최댓값이 dp[i][j]가 된다.
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine();
String s2 = br.readLine();
int[][] dp = new int[1002][1002];
for(int i=0; i<s1.length(); i++) {
for(int j=0; j<s2.length(); j++) {
if(s1.charAt(i) == s2.charAt(j)) {
dp[i+1][j+1] = dp[i][j] + 1;
}
else {
dp[i+1][j+1] = Math.max(dp[i][j+1], dp[i+1][j]);
}
}
}
System.out.print(dp[s1.length()][s2.length()]);
}
}