[BOJ] 5582. 공통 부분 문자열

2020. 7. 18. 20:57알고리즘/백준 문제 풀이

https://www.acmicpc.net/problem/5582

접근 방법

먼저 2개의 문자열에 대해 완전탐색을 하기로 결정함.

하지만 그렇게 하게 되면 N! 이 나오기 때문에 메모이제이션을 하기로 결정했다.

처음에 코드를 구현 할 때 나는 재귀적으로 풀어주려고 했었다.

static int recursive(int char1_index,int char2_index ){
        if(char1_index >= char1.size() || char2_index >= char2.size()){
            return 0;
        }
        if(dp[char1_index][char2_index]!=0){
            return dp[char1_index][char2_index];
        }
        dp[char1_index][char2_index] = 1;
        if(char1.get(char1_index) == char2.get(char2_index)){
            dp[char1_index][char2_index] += recursive(char1_index+1,char2_index+1);
        }else{
            dp[char1_index][char2_index] = 0;
        }
        return dp[char1_index][char2_index];
    }

요론식으로 하지만 정답은 맞았었지만 시간복잡도 결과가 너무 높았기에 다른 방법을 생각 해보았다.


그냥 같은 부분이 있으면 1을 증가시키면서 ans를 업데이트만 해주면 됬었다.

for(int i=1; i< char1.size()+1; i++){
            for(int k=1; k<char2.size()+1; k++){
                if(char1.get(i-1)==char2.get(k-1)){
                    dp[i][k] = 1+dp[i-1][k-1];
                    if(ans<dp[i][k]){
                        ans = dp[i][k];
                    }
                }
            }
        }
        bw.write(ans+"");

Need Know

  1. DP

전체 코드 ( Java )

import java.io.*;
import java.util.ArrayList;

class Main{
    static ArrayList<Character> char1 = new ArrayList<>();
    static ArrayList<Character> char2 = new ArrayList<>();
    static int dp[][];
    static int ans = 0;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException {
        set();
        solve();

        bw.flush();
        bw.close();
        br.close();
    }
    static void set() throws IOException {
        String str = br.readLine();
        for(int i=0; i<str.length(); i++){
            char1.add(str.charAt(i));
        }
        str = br.readLine();
        for(int i=0; i<str.length(); i++){
            char2.add(str.charAt(i));
        }
        dp = new int[char1.size()+1][char2.size()+1];
    }
    static void solve() throws IOException {
        for(int i=1; i< char1.size()+1; i++){
            for(int k=1; k<char2.size()+1; k++){
                if(char1.get(i-1)==char2.get(k-1)){
                    dp[i][k] = 1+dp[i-1][k-1];
                    if(ans<dp[i][k]){
                        ans = dp[i][k];
                    }
                }
            }
        }
        bw.write(ans+"");
    }
//    static int recursive(int char1_index,int char2_index ){
//        if(char1_index >= char1.size() || char2_index >= char2.size()){
//            return 0;
//        }
//        if(dp[char1_index][char2_index]!=0){
//            return dp[char1_index][char2_index];
//        }
//        dp[char1_index][char2_index] = 1;
//        if(char1.get(char1_index) == char2.get(char2_index)){
//            dp[char1_index][char2_index] += recursive(char1_index+1,char2_index+1);
//        }else{
//            dp[char1_index][char2_index] = 0;
//        }
//        return dp[char1_index][char2_index];
//    }
}

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[BOJ] 2186. 문자판  (0) 2020.07.20
[BOJ] 1365. 꼬인 전깃줄  (0) 2020.07.19
[BOJ] 14890. 경사로  (0) 2020.07.15
[BOJ] 19236. 청소년 상어  (0) 2020.07.15
[BOJ] 2342. Dance Dance Revolution  (0) 2020.07.14