|
| 1 | +package leetcode_study |
| 2 | + |
| 3 | +/* |
| 4 | +* ๊ฐ์ฅ ๊ธด ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ |
| 5 | +* ๋์ ๊ณํ๋ฒ์ ์ฌ์ฉํ ๋ฌธ์ ํด๊ฒฐ |
| 6 | +* ๋ฌธ์๊ฐ ๋์ผํ ๊ฒฝ์ฐ, table[i][j] = table[i-1][j-1] + 1. ์ฆ, ์ด์ ๊น์ง์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด ๊ธธ์ด์ 1์ ์ถ๊ฐ |
| 7 | +* ๋ฌธ์๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, table[i][j] = max(table[i-1][j], table[i][j-1]) ์ด๋ ํ์ฌ๊น์ง ์ฐพ์ ์ต์ฅ ๊ณตํต ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ ์งํ๋ ๊ณผ์ |
| 8 | +* |
| 9 | +* ์๊ฐ ๋ณต์ก๋: O(n^2) |
| 10 | +* -> ๋ ๋ถ์์ด์ ์ด์ค ๋ฐ๋ณต์ ์งํํ๋ ๊ฒฝ์ฐ |
| 11 | +* ๊ณต๊ฐ ๋ณต์ก๋: O(nm) (= n๊ณผ m์ ๊ฐ๊ฐ ์ฃผ์ด์ง ๋ฌธ์์ด์ ๊ธธ์ด) |
| 12 | +* -> dp table์ ์ฌ์ฉ๋๋ ๊ณต๊ฐ |
| 13 | +* */ |
| 14 | +fun longestCommonSubsequence(text1: String, text2: String): Int { |
| 15 | + val n = text1.length |
| 16 | + val m = text2.length |
| 17 | + val dp = Array(n + 1) { IntArray(m + 1) } |
| 18 | + |
| 19 | + for (i in 1..n) { |
| 20 | + for (j in 1..m) { |
| 21 | + if (text1[i - 1] == text2[j - 1]) { |
| 22 | + dp[i][j] = dp[i - 1][j - 1] + 1 |
| 23 | + } else { |
| 24 | + dp[i][j] = maxOf(dp[i - 1][j], dp[i][j - 1]) |
| 25 | + } |
| 26 | + } |
| 27 | + } |
| 28 | + return dp[n][m] |
| 29 | +} |
| 30 | + |
| 31 | +/* |
| 32 | +* ์ฃผ์ด์ง ๋ ๋ฌธ์์ด์ ๊ฐ๊ฐ์ Index๋ฅผ ๋์ด ๋น๊ตํด๊ฐ๋ฉฐ ํด๊ฒฐ ์๋ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ์๋ |
| 33 | +* Test case๋ฅผ ํต๊ณผํ์ง๋ง "bac", "abc"์ ๊ฐ์ case์์ "bc"๋ฅผ ๋ต์ผ๋ก ๋์ถํ ์ ์์ง๋ง "ac"์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ง๋์น๊ฒ๋จ |
| 34 | +* ์ฆ, ์ ๋ต์ด ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ ์ ์์. |
| 35 | +* */ |
| 36 | +fun longestCommonSubsequence(text1: String, text2: String): Int { |
| 37 | + var result = 0 |
| 38 | + var longOne: String |
| 39 | + var shortOne: String |
| 40 | + var longIndex = 0 |
| 41 | + var shortIndex = 0 |
| 42 | + |
| 43 | + if (text1.length >= text2.length) { |
| 44 | + longOne = text1 |
| 45 | + shortOne = text2 |
| 46 | + } else { |
| 47 | + longOne = text2 |
| 48 | + shortOne = text1 |
| 49 | + } |
| 50 | + |
| 51 | + while (shortIndex < shortOne.length) { |
| 52 | + if (shortOne[shortIndex] == longOne[longIndex]) { |
| 53 | + shortIndex += 1 |
| 54 | + longIndex += 1 |
| 55 | + result += 1 |
| 56 | + } else { |
| 57 | + longIndex += 1 |
| 58 | + } |
| 59 | + if (longIndex == longOne.length) break |
| 60 | + } |
| 61 | + |
| 62 | + return result |
| 63 | +} |
0 commit comments