Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- 스터디
- 백준알고리즘
- EC2
- ELB
- AWS
- 자료구조
- Router
- Spring Boot
- sort
- nodejs
- 리액트
- 라우터
- EventListener
- react
- mysql
- 완전탐색
- url parsing
- 백준
- 동적프로그래밍
- 브루트포스
- Algorithm
- 다익스트라 알고리즘
- 토이프로젝트
- 서버구축
- 알고리즘
- 탐욕법
- spring
- 정렬
- java
Archives
- Today
- Total
공부하는 블로그
Baekjoon | Q.9251 - LCS 본문
최장 공통 부분 수열(Longest Common Subsequence, LCS)를 찾는 문제이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
sc.close();
int[][] dp = new int[str1.length()][str2.length()];
for (int i = 0; i < dp.length; i++) {
char c1 = str1.charAt(i);
for (int j = 0; j < dp[0].length; j++) {
char c2 = str2.charAt(j);
if(c1 == c2) {
if(i == 0 || j == 0) {
dp[i][j] = 1;
}else {
dp[i][j] = dp[i-1][j-1] + 1;
}
}else {
if(i == 0) {
if(j == 0) {
dp[i][j] = 0;
}else {
dp[i][j] = dp[i][j-1];
}
}else {
if(j == 0) {
dp[i][j] = dp[i-1][j];
}else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
}
}
System.out.println(dp[str1.length()-1][str2.length()-1]);
}
}
동적 프로그래밍을 이용하여 문제를 해결했다. dp[i][j]는 0~i까지 str1, 0~j까지 str2 에서 LCS의 길이를 의미한다.
만약 비교하는 문자가 같다면 dp[i][j] = dp[i-1][j-1] + 1이 되고 같지 않다면 dp[i][j]는 dp[i-1][j]와 dp[i][j-1] 중 더 큰값이 된다. 배열에서 인덱스의 범위가 잘못될 경우를 고려하여 i와 j가 0일 경우를 따로 분기해주었다. 구글링을 통해 다른 사람들의 코드를 살펴보니 처음 배열을 잡을 때, 길이보다 +1만큼 배열을 선언해주면 간단하게 해결되는 문제였다..
ACAYKP CAPCAK를 예시로 살펴보자.
A | C | A | Y | K | P | |
C | 0 | 1 | 1 | 1 | 1 | 1 |
A | 1 | 1 | 2 | 2 | 2 | 2 |
P | 1 | 1 | 2 | 2 | 2 | 3 |
C | 1 | 2 | 2 | 2 | 2 | 3 |
A | 1 | 2 | 3 | 3 | 3 | 3 |
K | 1 | 2 | 3 | 3 | 4 | 4 |
예시의 두 문자열의 LCS의 길이는 4가 된다.
'알고리즘 공부' 카테고리의 다른 글
Algorithm | Binary Search (0) | 2020.06.12 |
---|---|
Baekjoon | Q.11054 - 가장 긴 바이토닉 부분 수열 (0) | 2020.06.11 |
Baekjoon | Q.11053 - 가장 긴 증가하는 부분 수열 (0) | 2020.06.11 |
Baekjoon | Q.12865 - 평범한 배낭 (0) | 2020.06.10 |
Baekjoon | Q.10844 - 쉬운 계단 수 (0) | 2020.06.09 |
Comments