BOJ 9251
2020-04-13
위 문제는 백준 사이트의 알고리즘 9251 문제에 관한 설명입니다.
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때,
모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
int[][] dp = new int[str1.length() + 1][str2.length() + 1];
for (int x = 1; x <= str1.length(); x++) {
char c1 = str1.charAt(x - 1);
for (int y = 1; y <= str2.length(); y++) {
char c2 = str2.charAt(y - 1);
if (c1 == c2) {
dp[x][y] = dp[x - 1][y - 1] + 1;
} else {
dp[x][y] = Math.max(dp[x - 1][y], dp[x][y - 1]);
}
}
}
System.out.println(dp[str1.length()][str2.length()]);
}
}
#include<cstdio>
#include<algorithm>
using namespace std;
char s1[1002], s2[1002];
int dp[1001][1001], i, j;
int main() {
scanf("%s %s", s1 + 1, s2 + 1);
for (i = 1; s1[i]; i++)
for (j = 1; s2[j]; j++)
dp[i][j] = max({ dp[i][j - 1], dp[i - 1][j],
dp[i - 1][j - 1] + (s1[i] == s2[j])
});
printf("%d", dp[i - 1][j - 1]);
return 0;
}
string 1과 2에 각 문자열을 넣고 c1에 str1번, c2에 str2번의 단어 하나씩을 선정해서 비교합니다.
만약 같다면 좌측 대각선의 값을 +1 시킵니다.
그렇지 않다면 좌측과 상단의 값중 더 큰값을 넣는 것입니다.