[c++] BOJ 9251๋ฒˆ :: LCS (ํ’€์ด ๋ฐ ์„ค๋ช… + ๋” ๋‚˜์€ ์ฝ”๋“œ)

LCS

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 19827 8068 6050 41.148%

๋ฌธ์ œ

LCS(Longest Common Subsequence, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด)๋ฌธ์ œ๋Š” ๋‘ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋˜๋Š” ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

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

์ž…๋ ฅ

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

์ถœ๋ ฅ

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

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋‚˜์˜ ๋‹ต

์ƒ๊ฐ์˜ ํ๋ฆ„
  1. ์™„์ „ํƒ์ƒ‰

    ์กฐ๊ฑด ์ค˜๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ

  2. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์šฐ์„  ์™„์ „ํƒ์ƒ‰์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” s1์˜ ๊ธธ์ด๋งŒํผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ index๋งˆ๋‹ค s2์˜ ๊ธธ์ด๋งŒํผ์„ ์ˆœํšŒํ•˜๊ณ  ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋“ค์˜ LCS ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ถ€๋ถ„๋ฌธ์ œ๋กœ ๋†“๊ณ  ๋ณธ๋‹ค๋ฉด ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

  1. ํ˜„์žฌ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๋ฉด

    ํ˜„์žฌ์˜ LCS ๊ธธ์ด๋Š” 2๋ฒˆ์งธ ๊ทธ๋ฆผ(s1์˜ ํฌ์ธํ„ฐ 1์ฆ๊ฐ€)๊ณผ 3๋ฒˆ์งธ ๊ทธ๋ฆผ(s2์˜ ํฌ์ธํ„ฐ 1์ฆ๊ฐ€) ์ค‘์— ํฐ ๊ฐ’๊ณผ ๊ฐ™๋‹ค.

    ํ˜„์žฌ index์—์„œ A, C๋Š” ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— s1, s2์˜ LCS๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

  1. ํ˜„์žฌ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด

    ํ˜„์žฌ์˜ LCS ๊ธธ์ด๋Š” s1๊ณผ s2์˜ ํฌ์ธํ„ฐ๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•œ 2๋ฒˆ์งธ ๊ทธ๋ฆผ์˜ LCS ๊ธธ์ด ๊ฐ’๊ณผ ๊ฐ™๋‹ค.

    ํ˜„์žฌ index์—์„œ A, A๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— LCS๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์„œ ๊ธธ์ด๋Š” 1์ฆ๊ฐ€ํ•˜๋ฉฐ ์ด๋ฅผ ์ œ์™ธํ•œ ๋‹ค์Œ๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ฒ€์‚ฌํ•˜๋ฉด ๋œ๋‹ค.

 
์ฝ”๋“œ
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;
string s1, s2;
int memorize[1001][1001];

int LCS(int p1, int p2) {
    if (memorize[p1][p2] != -1)
        return memorize[p1][p2];
    if (p1 >= s1.length() || p2 >= s2.length())
        return 0;
    if (p1 == s1.length() - 1 && p2 == s2.length() - 1) {
        memorize[p1][p2] = (s1[p1] == s2[p2]);
        return memorize[p1][p2];
    }

    int max_result;
    if (s1[p1] == s2[p2])
        max_result = LCS(p1 + 1, p2 + 1)+1;
    else
        max_result = max(LCS(p1 + 1, p2), LCS(p1, p2 + 1));

    memorize[p1][p2] = max_result;
    return max_result;
}


int main() {
    getline(cin, s1);
    getline(cin, s2);

    fill(&memorize[0][0], &memorize[1000][1001], -1);

    int answer =  LCS(0,0);
    cout << answer;
}

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

1000๊ฐœ์งœ๋ฆฌ

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACAYKP
CAKPAB

4

CBCBCBCB
BCBCBCA

6

APPLEY
APALPEY

5

PPPPP
PPPPPPPPPP

5

PPPPP
PPAPPAAP

5

ABCABC
CBACBA

3

ABCABC
ACBACB

4

BCDEFGHA
ACDEFGHB

6

1000๊ฐœ์˜ testcase๋ฅผ ๋Œ๋ ค๋ณด์•˜๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•„ ๋ฐ”๋กœ ์ œ์ถœํ–ˆ๋‹ค.

 

๋‹ค๋ฅธ ๋‹ต

#include <iostream>
#include <string>

using namespace std;

int dp[1001][1001];

int main() {
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);

    for (int j = 0; j < s2.length(); j++) {
        dp[0][j] = 0;
    }
    for (int i = 0; i < s1.length(); i++) {
        dp[i][0] = 0;
    }

    for (int i = 1; i <= s1.length(); i++) { // s1
        for (int j = 1; j <= s2.length(); j++) { // s2
            if (s1[i-1] != s2[j-1]) {
                dp[i][j] = dp[i-1][j] > dp[i][j - 1] ? dp[i-1][j] : dp[i][j - 1];
            }
            else {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
        }
    }
    cout << dp[s1.length()][s2.length()];
}

http://melonicedlatte.com/algorithm/2018/03/15/181550.html

์‚ฌ๋žŒ๋“ค์€ ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•˜๋‹ค :>

์—ฌ๊ธฐ์„œ ์œ„์™€ ์™ผ์ชฝ ์ค‘์— ํฐ ๊ฐ’์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ณธ์ธ์˜ ์ฝ”๋“œ์—์„œ ์š”์†Œ์˜ ๊ฐ’์ด ๋‹ค๋ฅผ ๋•Œ 2๊ฐ€์ง€ LCS ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋ถ€๋ถ„์ด๊ณ , ๋Œ€๊ฐ์„ ์˜ ๊ฐ’ + 1์„ ํ•œ ๋ถ€๋ถ„์€ ์š”์†Œ์˜ ๊ฐ’์ด ๊ฐ™์„ ๋•Œ ๋‹ค์Œ index์˜ LCS ๊ฐ’์— 1์„ ๋”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

๋ณธ์ธ๊ณผ ๋‹ค๋ฅธ์ 
  1. ์™„์ „ํƒ์ƒ‰

    ๋ณธ์ธ์€ ์กฐ๊ฑด์„ ์ค˜์„œ ๊ฐ™์€ ์š”์†Œ๊ฐ€ ๋‚˜์˜ฌ ๊ฒฝ์šฐ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ์‹คํ–‰ ์•ˆํ•ด๋„ ๋˜๊ฒŒ๋” ๋งŒ๋“ค์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” i๋ฅผ s1์˜ ๊ธธ์ด๋งŒํผ, j๋ฅผ s2์˜ ๊ธธ์ด๋งŒํผ ๋Œ๋ฆฌ๋ฉด์„œ ์™„์ „ ํƒ์ƒ‰ํ•˜์˜€๋‹ค.

  2. ๋ฉ”๋ชจ์ด์ œ์ด์…˜

    ๋ณธ์ธ์€ 2์ฐจ์› arr ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ๊ตฌํ•œ ๊ฐ’์ผ ๊ฒฝ์šฐ return ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ array๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๋กœ์จ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํƒˆ ํ•„์š”๊ฐ€ ์—†์–ด์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋‹จ์ถ•๋˜์—ˆ๋‹ค.

 

์œ„์ชฝ์ด ๋ณธ์ธ์˜ ์ฝ”๋“œ, ์•„๋ž˜์ชฝ์ด ์œ„ ๋งํฌ์˜ ์ฝ”๋“œ์ด๋‹ค.

๋ฐ˜์‘ํ˜•