๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.9251 LCS ๋ฌธ์ œ ํ’€์ด - java

๐Ÿ“– ๋ฌธ์ œ

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

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด)๋ฌธ์ œ๋Š”

๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ACAYKP์™€ CAPCAK์˜ LCS๋Š” ACAK๊ฐ€ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„๊ณผ ๋‘˜์งธ ์ค„์— ๋‘ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 1000๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋‘ ๋ฌธ์ž์—ด์˜ LCS์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด) ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ˆ˜์—ด ๋ฌธ์ œ์˜ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค.

๊ฐ ๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ๋“ค์„ ๋น„๊ตํ•ด ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

table

๊ฐ ๋ถ€๋ถ„์ง‘ํ•ฉ๋“ค์— ๋Œ€ํ•ด ์œ„์™€ ๊ฐ™์ด ํ‘œ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์ ํ™”์‹์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

word1 ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๋ฌธ์ž์™€ word2 ๋ฌธ์ž์—ด์˜ j๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž์ผ ๋•Œ => word1.charAt(i)==word2.charAt(j)

word1์˜ i-1๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ฌธ์ž์—ด๊ณผ word2์˜ j-1๋ฒˆ์งธ๊นŒ์ง€์˜ ๋‘ ๋ฌธ์ž์—ด ๊ฐ„์˜ LCS ๊ธธ์ด๊ฐ€ 1์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// word1.charAt(i-1)==word2.charAt(j-1) ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ!

if(word1.charAt(i-1)==word2.charAt(j-1)){
    dp[i][j] = dp[i-1][j-1]+1;
}

์™œ๋ƒํ•˜๋ฉด word1์˜ i-1๋ฒˆ์งธ๊นŒ์ง€์˜ ๋ฌธ์ž์—ด๊ณผ word2์˜ j-1๋ฒˆ์งธ๊นŒ์ง€์˜ ๋‘ ๋ฌธ์ž์—ด ๊ฐ„์˜ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ x ์ผ๋•Œ

word1์˜ i๋ฒˆ์งธ ๋ฌธ์ž์™€ word2์˜ j๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๋™์ผํ•˜๋ฉด ๊ทธ ์ „๊นŒ์ง€์˜ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์— ๊ณตํ†ต ๋ฌธ์ž ํ•˜๋‚˜๊ฐ€ ๋” ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด 1 ์ฆ๊ฐ€ => dp[i][j] = dp[i-1][j-1]+1 

๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์ธ word1 ๋ฌธ์ž์—ด์˜ i๋ฒˆ์งธ ๋ฌธ์ž์™€ word2 ๋ฌธ์ž์—ด์˜ j๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ž์ผ ๋•Œ๋Š”

ํ…Œ์ด๋ธ”์˜ ๋ฐ”๋กœ ์ „ ์—ด์˜ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด์™€ dp[i][j-1] ํ…Œ์ด๋ธ”์˜ ๋ฐ”๋กœ ์ „ ํ–‰์˜ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ธธ์ด dp[i-1][j] ๋ฅผ ๋น„๊ตํ•ด ๋” ๊ธด ๊ธธ์ด๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);

๐Ÿ’ป ์ฝ”๋“œ

package problem.dynamic;

import java.io.*;

public class Main_9251 {
    static int dp[][];
    static StringBuilder sb;
    static String word1;
    static String word2;
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        input();
        sb = new StringBuilder();
        solve();
        bw.flush();
        bw.close();
    }
    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        word1 = br.readLine();
        word2 = br.readLine();
        dp = new int[word1.length()+1][word2.length()+1];
        br.close();
    }
    public static void solve() {
        for(int i = 0; i <= word1.length(); i++)
            dp[i][0] = 0;
        for(int i = 0; i <= word2.length(); i++)
            dp[0][i] = 0;

        for(int i=1; i<=word1.length(); i++){
            for(int j=1; j<=word2.length(); j++){

                // word1.charAt(i-1)==word2.charAt(j-1) ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ!
                if(word1.charAt(i-1)==word2.charAt(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[word1.length()][word2.length()]);
    }
}
Written on February 16, 2021