https://www.acmicpc.net/problem/5582
5582번: 공통 부분 문자열
두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오. 어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들
www.acmicpc.net
코드설명
DP 문제입니다.
이 문제에서 DP = new int[str1.length()][str2.length()] 는 가장 긴 공통 부분 문자열의 개수를 의미합니다.
아래의 예시와 함께 살펴봅니다.
입력 ABRACADABRA ECADADABRBCRDARA 출력 5
1. ABRACADABRA 를 먼저 str2의 시작인 E로 확인합니다. 같은 숫자가 하나도 없으므로 DP[0][1~str1.length()] = 0 입니다.
2. ABRACADABRA 를 이제 str2의 두번째 값인 C로 확인합니다. str1.charAt(5)에서 "C"를 발견했습니다. "C"의 이전 숫자인 "E"와 연관되었는지 확인하기 위해 DP[1][5] = DP[0][4] + 1 을 처리합니다. DP[0][4]를 체크하는 이유는 해당 값을 통해 "C"이전 숫자와 연결되었는지 확인하기 위함입니다.
3. 1~2번의 로직을 계속해서 을 반복합니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static int T, N; public static int answer = 0; public static int[][] DP; public static String str1, str2; public static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); str1 = st.nextToken(); st = new StringTokenizer(br.readLine()); str2 = st.nextToken(); DP = new int[str1.length()][str2.length()]; for(int i=0; i<str1.length(); i++) { for(int j=0; j<str2.length(); j++) { if(str1.charAt(i) == str2.charAt(j)) { if( i - 1 < 0 || j - 1 < 0) { DP[i][j] = 1; } else { DP[i][j] = DP[i-1][j-1] + 1; } answer = Math.max(answer, DP[i][j]); } } } System.out.println(answer); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17069 파이프 옮기기 2 - DP JAVA (0) | 2023.11.08 |
---|---|
[백준] 14226 이모티콘 - BFS + DP JAVA (0) | 2023.11.08 |
[백준] 2688 줄어들지 않아 - 동적계획법(DP, Dynamic Programming) JAVA (0) | 2023.11.07 |
[백준] 1904 01타일 - 동적계획법(Dynamic Programming, DP) JAVA (0) | 2023.11.05 |
[백준] 11729 하노이 탑 이동 순서 - 재귀 JAVA (0) | 2023.11.05 |