반응형
[Gold V] LCS - 9251
분류
다이나믹 프로그래밍, 문자열
문제 설명
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
풀이 및 코드
풀이는 아래에 LCS 알고리즘과 함께 정리해두었습니다.
[Computer Science/Algorithm] - 최장 공통 부분 수열 (LCS; Longest common subsequence problem)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] a = br.readLine().split("");
String[] b = br.readLine().split("");
int[][] map = new int[a.length+1][b.length+1]; // 수열의 길이를 저장하는 map
int answer = 0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
if (a[i].equals(b[j])) { // 만약 a[i]와 b[j]가 같은 문자라면 map[i+1][j+1]에 map[i][j]+1 을 넣는다.
map[i+1][j+1] = map[i][j] + 1;
answer = Math.max(answer, map[i+1][j+1]); // answer 값 큰걸로 변경
}else{ // 다른 문자라면 map[i+1][j+1]에 map[i][j+1]과 map[i+1][j] 중 큰 값을 넣는다.
map[i+1][j+1] = Math.max(map[i+1][j], map[i][j+1]);
}
}
}
System.out.println(answer);
}
}
메모리: 16944 KB, 시간: 124 ms
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Gold IV] 트리의 지름 - 1967 (0) | 2024.12.12 |
---|---|
[백준/Gold III] 파티 - 1238 (0) | 2024.12.11 |
[백준/Gold III] 웜홀 - 1865 (1) | 2024.12.07 |
[백준/Gold IV] N-Queen - 9663 (0) | 2024.12.05 |
[백준/Gold V] 숨바꼭질 3 - 13549 (0) | 2024.12.02 |