9252 - LCS 2 (Java)

๋ฐ•์„ธ๊ฑดยท2025๋…„ 2์›” 28์ผ
0
post-thumbnail

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ


๐Ÿ“ ๋ฌธ์ œ ์„ค๋ช…

๋‘ ๋ฌธ์ž์—ด A์™€ B๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,
๋‘ ๋ฌธ์ž์—ด์˜ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด(Longest Common Subsequence, LCS) ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž„.
์˜ˆ๋ฅผ ๋“ค์–ด, A = "ACAYKP", B = "CAPCAK"์ธ ๊ฒฝ์šฐ LCS๋Š” "ACAK"์ž„.


โœ… ํ’€์ด ์ ‘๊ทผ ๋ฐฉ์‹ ๋ฐ ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•๋“ค

์ฒซ ๋ฒˆ์งธ ์‹œ๋„: StringBuilder๋ฅผ ์ด์šฉํ•œ ๋ˆ„์  ๋ฐฉ์‹

  • ๋ฐฉ๋ฒ•:
    LCS์˜ ๊ธธ์ด๊ฐ€ ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค StringBuilder์— ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•จ.
  • ๋ฌธ์ œ์ :
    ์˜ˆ๋ฅผ ๋“ค์–ด,
    • A = AACAAABAA
    • B = AAACAABAA
      ์™€ ๊ฐ™์ด ๋ฐ˜๋ก€๊ฐ€ ์กด์žฌํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ LCS ๋ฌธ์ž์—ด์„ ๋ณต์›ํ•˜์ง€ ๋ชปํ•จ.

๋‘ ๋ฒˆ์งธ ์‹œ๋„: String[][] ๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ DP

  • ๋ฐฉ๋ฒ•:
    ๊ฐ DP ์ƒํƒœ์—์„œ LCS ๋ฌธ์ž์—ด ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด String[][] ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•จ.
  • ๋ฌธ์ œ์ :
    DP ํ…Œ์ด๋ธ”์˜ ๊ฐ ์…€๋งˆ๋‹ค ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰์ฆํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•จ.

์ตœ์ข… ํ•ด๊ฒฐ๋ฒ•: ๋ฐฑํŠธ๋ž˜ํ‚น ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•œ DP

  • ๋ฐฉ๋ฒ•:
    • DP ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ:
      • dp[i][j]: A์˜ ์ฒ˜์Œ i ๊ธ€์ž์™€ B์˜ ์ฒ˜์Œ j ๊ธ€์ž์— ๋Œ€ํ•ด ๊ตฌํ•œ LCS์˜ ๊ธธ์ด.
      • dpDir[i][j]: LCS์˜ ๊ธธ์ด๊ฐ€ ๊ฐฑ์‹ ๋  ๋•Œ, ํ•ด๋‹น ๊ฐ’์ด ์–ด๋””์„œ ์ „์ด๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด.
        • 1: ๋Œ€๊ฐ์„  (A[i-1] == B[j-1])์—์„œ ๊ฐฑ์‹ ๋จ
        • 2: ์™ผ์ชฝ (dp[i][j-1])์—์„œ ๊ฐฑ์‹ ๋จ
        • 3: ์œ„์ชฝ (dp[i-1][j])์—์„œ ๊ฐฑ์‹ ๋จ
    • ๋ฐฑํŠธ๋ž˜ํ‚น:
      dpDir ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด, ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์—ญ์œผ๋กœ ์ถ”์ ํ•จ์œผ๋กœ์จ ์ตœ์ข… LCS ๋ฌธ์ž์—ด์„ ๋ณต์›ํ•จ.
  • ์žฅ์ :
    ๊ฐ DP ์ƒํƒœ์— ๋Œ€ํ•ด ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹ ,
    ์ „์ด ์ •๋ณด(ํฌ์ธํ„ฐ)๋งŒ ์ €์žฅํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์˜€์Œ.

๐Ÿ” ์ตœ์ข… ์ฝ”๋“œ ๊ตฌํ˜„

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static StringTokenizer st;
    private static StringBuilder sb = new StringBuilder();
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    public static void main(String[] args) throws IOException {
        String A = br.readLine();
        String B = br.readLine();
        
        // dp ๋ฐฐ์—ด: LCS์˜ ๊ธธ์ด๋ฅผ ์ €์žฅ
        int[][] dp = new int[A.length() + 1][B.length() + 1];
        // dpDir ๋ฐฐ์—ด: ๋ฐฑํŠธ๋ž˜ํ‚น ํฌ์ธํ„ฐ ์ €์žฅ (์–ด๋А ๋ฐฉํ–ฅ์—์„œ ๊ฐฑ์‹ ๋˜์—ˆ๋Š”์ง€)
        int[][] dpDir = new int[A.length() + 1][B.length() + 1];
        
        // DP ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ
        for (int i = 1; i <= A.length(); i++) {
            for (int j = 1; j <= B.length(); j++) {
                if (A.charAt(i - 1) == B.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    dpDir[i][j] = 1; // ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ
                } else {
                    if (dp[i][j - 1] > dp[i - 1][j]) {
                        dp[i][j] = dp[i][j - 1];
                        dpDir[i][j] = 2; // ์™ผ์ชฝ ๋ฐฉํ–ฅ
                    } else {
                        dp[i][j] = dp[i - 1][j];
                        dpDir[i][j] = 3; // ์œ„์ชฝ ๋ฐฉํ–ฅ
                    }
                }
            }
        }
        
        // LCS์˜ ๊ธธ์ด ์ถœ๋ ฅ
        System.out.println(dp[A.length()][B.length()]);
        
        // LCS ๋ฌธ์ž์—ด ๋ณต์› (๋ฐฑํŠธ๋ž˜ํ‚น)
        if (dp[A.length()][B.length()] != 0) {
            int x = A.length();
            int y = B.length();
            while (x > 0 && y > 0) {
                if (dpDir[x][y] == 1) {
                    sb.append(A.charAt(x - 1));
                    x--;
                    y--;
                } else if (dpDir[x][y] == 2) {
                    y--;
                } else {
                    x--;
                }
            }
            sb.reverse();
            System.out.println(sb.toString());
        }
    }
}

โœ… ๊ฒฐ๋ก 

  • ์ดˆ๊ธฐ ์‹œ๋„:
    StringBuilder๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆ„์ ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฐ˜๋ก€๋กœ ์ธํ•ด ์‹คํŒจํ•˜์˜€์Œ.
  • ๋‘ ๋ฒˆ์งธ ์‹œ๋„:
    String[][] ๋ฐฐ์—ด๋กœ DP ์ƒํƒœ๋งˆ๋‹ค LCS ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•จ.
  • ์ตœ์ข… ํ•ด๊ฒฐ:
    DP๋กœ LCS์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , dpDir ๋ฐฐ์—ด์— ์ „์ด ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ ํ›„ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ LCS๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.
    ์ด ๋ฐฉ๋ฒ•์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ์˜ฌ๋ฐ”๋ฅธ LCS ๋ฌธ์ž์—ด์„ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Œ.
profile
๋ฉ‹์žˆ๋Š” ์‚ฌ๋žŒ - ์ผ๋‹จ ํ•˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€