🔺 문제
9252번: LCS 2
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import java.util.*;
import java.io.*;
public class Main {
private static long[][] DP; // 2차원 점화식 배열
private static ArrayList<Character> Path; // LCS 저장 리스트
private static char[] A;
private static char[] B;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
A = br.readLine().toCharArray();
B = br.readLine().toCharArray();
DP = new long[A.length + 1][B.length + 1];
Path = new ArrayList<>();
// 2차원 점화식 배열 채우기
for(int i = 1 ; i <= A.length ; i++) {
for(int j = 1 ; j <= B.length ; j++) {
// 같은 문자열일 때 왼쪽 대각선 값 + 1
if(A[i - 1] == B[j - 1]) {
DP[i][j] = DP[i - 1][j - 1] + 1;
}
// 다르면 왼쪽과 위쪽 값 중 큰 수
else {
DP[i][j] = Math.max(DP[i - 1][j], DP[i][j - 1]);
}
}
}
System.out.println(DP[A.length][B.length]);
// 🔔 LCS 출력
getText(A.length, B.length);
for(int i = Path.size() - 1 ; i >= 0 ; i--) { // 역추적
System.out.print(Path.get(i));
}
System.out.println();
br.close();
}
// LCS 출력 메소드
private static void getText(int r, int c) {
if(r == 0 || c == 0) return;
// 같으면 LCS에 기록하고 왼쪽 위로 이동
if(A[r - 1] == B[c - 1]) {
Path.add(A[r - 1]);
getText(r - 1, c - 1);
}
else {
// 다르면 왼쪽과 위쪽 중 큰 수로 이동
if(DP[r - 1][c] > DP[r][c - 1])
getText(r - 1, c);
else
getText(r, c - 1);
}
}
}
|
cs |
✅ 해결 아이디어
✔ DP ⊃ LCS - 점화식
🔺 다른 풀이들
- 오홋 LCS 출력하는 부분에서 스택을 이용하셨다.
[BOJ] 백준 9252번 LCS2 (Java)
#9252 LCS2 난이도 : 골드 5 유형 : DP 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들
loosie.tistory.com
- 상세한 과정 설명 감사합니다..
[알고리즘/자바] 백준 9252번 - LCS 2
9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된
soojong.tistory.com
💬 느낀 점
이해하고 나니 재밌네...
DP야 나랑 친해지자 젭알,,,,~~
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 7/6 |
(참고)
✔ Do it 알고리즘 코딩테스트 자바편
✔ LCS (최장 공통 문자열)
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence
LCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.
velog.io
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 1328번: 고층 빌딩 (0) | 2023.05.16 |
---|---|
[백준/JAVA] 1915번: 가장 큰 정사각형 (1) | 2023.05.16 |
[백준/JAVA] 13398번: 연속합 2 (1) | 2023.05.15 |
[백준/JAVA] 10844번: 쉬운 계단 수 (0) | 2023.05.15 |
[백준/JAVA] 2193번: 이친수 (1) | 2023.05.15 |