๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š ์ „๊ณต ๊ณต๋ถ€/๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•

[๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•] 11. ๋™์  ๊ณ„ํš๋ฒ•

 

๋™์  ๊ณ„ํš๋ฒ• (DP)

  • ์ตœ์ ํ™” ๋ฌธ์ œ, ๋ถ„ํ•  ์ •๋ณต
  • ํ•œ ๋ฌธ์ œ๋ฅผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์ด๋ฉด์„œ ํฌ๊ธฐ๋งŒ ์ž‘์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค.
  • ๊ธˆํ™” ๋ชจ์œผ๊ธฐ ๋ฌธ์ œ
    • D[i][j] : (i, j)๊นŒ์ง€ ์˜ค๋Š” ๋™์•ˆ ๋ชจ์„ ์ˆ˜ ์žˆ๋Š” ๊ธˆํ™”์˜ ์ตœ๋Œ“๊ฐ’
    • D[i][j] = max( D[i-1],[j] , D[i][j-1] ) + map[i][j];

 

์ตœ๋Œ€ ๊ณต๋ฐฑ ์ •์‚ฌ๊ฐํ˜• (ํฐ์ƒ‰์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•)

  • mm ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์ด ์žˆ๋‹ค๋ฉด, 4๊ฐœ์˜ (m-1)(m-1) ํฌ๊ธฐ ์ •์‚ฌ๊ฐํ˜•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐฉ์•ˆํ•œ๋‹ค.
  • D[x][y]๋Š” (x,y)๊ฐ€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๊ผญ์ง€์ ์ธ ์ •์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
    • (x,y)๊ฐ€ ๊ฒ€์€์ƒ‰์ด๋ฉด, D[x][y] = 0
    • ํฐ์ƒ‰์ด๋ฉด,
      1. x==1 && y==1 : D[x][y] = 1
      2. else : D[x][y] = min(D[x-1][y-1] , D[x-1][y] , D[x][y-1] ) + 1

 

์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„์„œ์—ด ๋ฌธ์ œ (LCS) : ์ˆœ์„œ๋Š” ์ง€ํ‚ค๋˜, ์—ฐ์†์ผ ํ•„์š”๋Š” ์—†์Œ. LCS ๊ธธ์ด ๊ตฌํ•˜๊ธฐ

 

  1. ๋ธŒ๋ฃจํŠธ ํฌ์Šค O(2^n) : ๊ธธ์ด๊ฐ€ n์ธ ์„œ์—ด์— ๋Œ€ํ•ด์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  2^n๊ฐœ์˜ ๋ถ€๋ถ„ ์„œ์—ด์„ ๋น„๊ต
  2. ์žฌ๊ท€ O(m * n) : ํ•˜๋‚˜๋Š” ๊ธธ์ด๊ฐ€ m, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ธธ์ด๊ฐ€ n์ผ ๋•Œ (๋‘˜๋‹ค n์ด๋ฉด O(n^2))
    1. ABA์™€ DAB์˜ LCS๋Š” ์•„๋ž˜์˜ ์…‹ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ ์ ์—์„œ ์ฐฉ์•ˆํ•˜์—ฌ ์žฌ๊ท€๋กœ ํ’€๋ฉด, O(m * n). LCS(AB, DAB), LCS(ABA, DA), LCS(AB, DA)
    2. ํ•˜์ง€๋งŒ ์ค‘๋ณต ๊ณ„์‚ฐ์ด ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    int lcs( char *X, char *Y, int m, int n )
    {
       if (m == 0 || n == 0)
         return 0;
       if (X[m-1] == Y[n-1])
         return 1 + lcs(X, Y, m-1, n-1); // ๋งจ ๋’ค ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด 1์„ ๋”ํ•œ๋‹ค.
       else
         return max(lcs(X, Y, m, n-1), lcs(X, Y, m-1, n)); // ๋งจ ๋’ค ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋ฉด, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋บ€ ๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜
    }
     
    int main() {
      char X[] = "AGGTAB";
      char Y[] = "GXTXAYB";
      int m = strlen(X);
      int n = strlen(Y);
      printf("Length of LCS is %d\\n", lcs( X, Y, m, n ) );
    return 0; }
    
  3. DP : ์ค‘๋ณต๊ณ„์‚ฐ์ด ์—†๋Š” O(m * n)
    1. ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•˜๋ฏ€๋กœ ์žฌ๊ท€๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ณ , ์ค‘๋ณต๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
    int lcs( char *X, char *Y, int m, int n )
    { int L[m+1][n+1];
    int i, j;
    for (i=0; i<=m; i++)   {
      for (j=0; j<=n; j++) {
        if (i == 0 || j == 0) L[i][j] = 0;
        else if (X[i] == Y[j])
    		    L[i][j] = L[i-1][j-1] + 1; // ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด 1์„ ๋”ํ•˜๊ธฐ
        else
    		    L[i][j] = max(L[i-1][j], L[i][j-1]); // ๋‹ค๋ฅด๋ฉด, ์ด์ „ ๊ฐ’๋“ค ์ค‘ ์ตœ๋Œ€๊ฐ’ ๋„ฃ๊ธฐ
        }
    	}
    }
       return L[m][n];
    }
    

๋‘ ๋ฌธ์ž์—ด์˜ ์œ ์‚ฌ๋„

  1. Hamming Distance : ๋‹จ์ˆœํžˆ ํ‹€๋ฆฐ ๊ธ€์ž์ˆ˜๋งŒ ๋น„๊ตํ•œ๋‹ค. O(n). ๋งค์šฐ ๋ถ€์ •ํ™•.
  2. ํŽธ์ง‘ ๊ฑฐ๋ฆฌ (Edit distance)
    1. ๋ฌธ์ž์—ด a๋ฅผ b๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์˜ ์—ฐ์‚ฐ์ด ์ตœ์†Œ ๋ช‡ ๋ฒˆ ํ•„์š”ํ•œ๊ฐ€?
      • ํ•œ ๊ธ€์ž ์ง€์šฐ๊ธฐ, ํ•œ ๊ธ€์ž ์ถ”๊ฐ€ํ•˜๊ธฐ, ํ•œ ๊ธ€์ž ๋ฐ”๊พธ๊ธฐ
    2. ์ ํ™”์‹ : D[i][j] = T1[1..i]์„ T2[1..j]๋กœ ๋ฐ”๊พธ๋Š” ํŽธ์ง‘ ๊ฑฐ๋ฆฌ ์ €์žฅ → D[i][j]๋Š” ๋‹ค์Œ ์„ธ ๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ’์ด๋‹ค.
      • D[i][j-1] + 1 : T1[1..i]์„ T2[1..j-1]๋กœ ๋ฐ”๊พธ๊ณ  ๋งˆ์ง€๋ง‰ ๋ฌธ์ž T2[j] ์ถ”๊ฐ€
      • D[i-1][j] + 1 : T1[1..i]์„ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๋ฅผ ๋นผ์„œ T1[1..i-1]๋กœ ๋ฐ”๊พธ๊ณ  ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ์ถ”๊ฐ€ํ•ด์„œ T2[1..j]๋กœ
      • D[i-1][j-1] + 0/1 : T1[1..i-1]์„ T2[1..j-1]๋กœ ๋ฐ”๊พผ ๋‹ค์Œ, T1[i] == T2[j] : ๊ทธ๋Œ€๋กœ, else : T1[i]์„ T2[j]๋กœ ๋ฐ”๊พธ๋Š” ๊ฑฐ ํ•œ๋ฒˆ
    // DP ์ฝ”๋“œ : O(m * n)
    int editDistDP(string str1, string str2, int m, int n)
    {
        int dp[m+1][n+1];
        for (int i=0; i<=m; i++)    {
            for (int j=0; j<=n; j++)        {
                if (i==0) dp[i][j] = j;  // Min. operations = j
                else if (j==0) dp[i][j] = i; // Min. operations = i
                else if (str1[i-1] == str2[j-1]) dp[i][j] = dp[i-1][j-1]; // ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด
                else dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]); // 3๊ฐœ ์ค‘ ์ตœ์†Œ์˜ ๋ฐฉ๋ฒ•์— 1์„ ๋”ํ•˜๊ธฐ
     } }
        return dp[m][n];
    }
    
     
    1.