Java- 메모리: 18632 KB, 시간: 132 ms
C++ - 메모리: 5984 KB, 시간: 4 ms
다이나믹 프로그래밍, 문자열
2024년 12월 20일 22:36:47
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

/**
* Author: yngbao97, Yuk Yejin
* Problem: LCS_9251
* Date: 2024.12.20
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
char[] str_1 = input();
char[] str_2 = input();
int[][] dp = new int[str_1.length][str_2.length];
for (int i = 1; i < str_1.length; i++) {
for (int j = 1; j < str_2.length; j++) {
if (str_1[i] == str_2[j]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
bw.write(String.valueOf(dp[str_1.length-1][str_2.length-1]));
bw.flush();
bw.close();
br.close();
}
public static char[] input() throws IOException {
char[] input = br.readLine().toCharArray();
char[] result = new char[input.length + 1];
int idx = 1;
for (char c : input) {
result[idx++] = c;
}
return result;
}
}
/**
* Author: yngbao97, Yuk Yejin
* Problem: LCS_9251
* Date: 2024.12.20
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
vector<char> first(a.begin(), a.end());
vector<char> second(b.begin(), b.end());
vector<vector<int> > dp(first.size() + 1, vector<int>(second.size() + 1));
for (int i = 1; i <= first.size(); i++) {
for (int j = 1; j <= second.size(); j++) {
if (first[i-1] == second[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
cout << dp[first.size()][second.size()] << "\n";
return 0;
}