๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/ETC

์ตœ์žฅ๊ณตํ†ต๋ฌธ์ž์—ด(Longest Common Substring - LCS)

Amenable 2023. 4. 1. 09:40

  ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ LCS๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ํ•˜์ž. ์ผ๋ฐ˜์ ์œผ๋กœ LCS๋ผ๊ณ  ํ•˜๋ฉด ์ตœ์žฅ๊ณตํ†ต๋ถ€๋ถ„์ˆ˜์—ด(Longest Common Subsequence)์„ ๋œปํ•˜์ง€๋งŒ, ์ตœ์žฅ๊ณตํ†ต ๋ฌธ์ž์—ด(Longest Common Sustring)๋„ LCS๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ๋‘˜์˜ ์ฐจ์ด์ ์€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ์—ฐ์†์„ฑ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ตœ์žฅ๊ณตํ†ต ๋ฌธ์ž์—ด(Longest Common Substring)์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„๋ณด์ž

 

1. ๊ฐœ๋… ๐Ÿฆ†

  ์ตœ์žฅ๊ณตํ†ต๋ถ€๋ถ„๋ฌธ์ž์—ด(LCS)์€ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ค‘ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด ๋ฌธ์ž์—ด์„ ๋งํ•œ๋‹ค. 

 

2. ๋™์ž‘ ๋ฐฉ์‹ ๐Ÿ“

  ๋™์ž‘ ๋ฐฉ์‹์€ DP๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋ฌธ์ž์—ด A์™€ ๋ฌธ์ž์—ด B๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

  1. ๋ฌธ์ž์—ด A์™€ ๋ฌธ์ž์—ด B๋ฅผ ํ•œ ๊ธ€์ž์”ฉ ๋น„๊ตํ•œ๋‹ค.
  2. ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด DP[i][j]๋Š” DP[i-1][j-1] + 1์ด ๋œ๋‹ค.
    ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด DP[i][j]์— 0์„ ํ‘œ์‹œํ•œ๋‹ค.
  3. 1๋ฒˆ๊ณผ 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์œ„์—์„œ ๋งํ•œ DP[i][j]๋Š” ๋ฌธ์ž์—ด A๋Š” i๋ฒˆ์งธ๊นŒ์ง€ ๋ฌธ์ž์—ด B๋Š” j๋ฒˆ์งธ๊นŒ์ง€ ๊ณ ๋ คํ•˜์˜€์„ ๊ฒฝ์šฐ์— ์–ป์€ ์ตœ์žฅ๊ณตํ†ต๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ธธ์ด์ด๋‹ค. i์™€ j๋Š” 1๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊นŒ์ง€ ์ˆœํšŒ๋ฅผ ํ•˜๊ณ  i ๋˜๋Š” j๊ฐ€ 0์ธ ์žฅ์†Œ์˜ DP๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  • ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ 'DP[i][j] = DP[i-1][j-1] + 1'์„ ํ•˜๋Š” ์ด์œ 
    ์ด์ „ ์ƒํ™ฉ๊นŒ์ง€์˜ ์ตœ์žฅ๊ณตํ†ต๋ถ€๋ถ„๋ฌธ์ž์—ด์— ํ˜„์žฌ ๋น„๊ต๋œ ๊ฐ™์€ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
  • ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๋•Œ 'DP[i][j] = 0'์ด ๋˜๋Š” ์ด์œ 
    ์ตœ์žฅ๊ณตํ†ต๋ถ€๋ถ„๋ฌธ์ž์—ด์€ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ „์ œ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์†์„ฑ์ด ์—†์–ด์ง€๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

  'ABCDEF'์™€ 'GBCDFE'๋ฅผ ์ด์šฉํ•˜์—ฌ LCS๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ทธ๋ฆผ์„ ์ด์šฉํ•˜์—ฌ ์ดํ•ดํ•ด ๋ณด์ž.

 

3. ๊ตฌํ˜„(JAVA) ๐Ÿฆข

  i ๋˜๋Š” j๊ฐ€ 0์ด๋ผ๋ฉด DP(๋น„๊ต๋ฅผ ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ)์˜ ๊ฐ’์ด 0์ด๋ผ๋Š” ๊ฒƒ๋งŒ ์ฃผ์˜ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.

public static void main(String[] args) {
    String A = "ABCDEF";
    String B = "GBCDFE";
    int aStrLen = A.length();
    int bStrLen = B.length();
    // LCS์˜ ๊ธธ์ด
    int maxLen = 0;
    int[][] DP = new int[aStrLen + 1][bStrLen + 1];

    for(int i = 1; i <= aStrLen; i++) {
        for(int j = 1; j <= bStrLen; j++) {
            // ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ
            if(A.charAt(i - 1) == B.charAt(j - 1)) {
                DP[i][j] = DP[i - 1][j - 1] + 1;
                maxLen = Math.max(maxLen, DP[i][j]);
            }
            // ๋น„๊ตํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
            else {
                DP[i][j] = 0;
            }
        }
    }

    System.out.println(maxLen);
}

 

ํ•ด๋‹น ๊ธ€์€ emplam27 ๋‹˜์˜ '๊ทธ๋ฆผ์œผ๋กœ ์•Œ์•„๋ณด๋Š” LCS ์•Œ๊ณ ๋ฆฌ์ฆ˜'์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.