- νμ¬ λ¬Έμμ΄μ μΆκ°νλ κ²½μ°, μΆκ°νμ§ μλ κ²½μ°λ‘ λλμ΄ μ¬κ· νΈμΆλ‘ νμ΄λ³΄λ €κ³ νμ§λ§ μ€ν¨.
- λ¬Έμμ΄μ μμͺ½ λΆν° μΌλΆλΆμ μ·¨νμ¬ ν΄λΉ λ¬Έμμ΄μμ μ΅λ
k
κ° λ§νΌμ λ¬Έμμ΄μ μμ νλ€κ³ νμ λ encoding λ κΈΈμ΄λ₯Ό μ°¨λ‘λλ‘ κ΅¬νλ€.
- μλΆλΆ λΆν° νΉμ κΈΈμ΄
len
λ‘ μλ₯Έ λ¬Έμμ΄μ λνμ¬ del
κ°μ λ¬Έμμ΄μ μμ νμ λ encoding λ κΈΈμ΄λ₯Ό ꡬνλ€. - λ¨Όμ κ°μ₯ μ¬μ΄ μΌμ΄μ€λ νμ¬ λ¬Έμμ΄μ μμ νλ κ²½μ°μ΄λ€.
- νμ¬ λ¬Έμμ΄μ μμ νλ€λ©΄ κ·Έ κ°μ μ΄μ κΈΈμ΄
len - 1
μμ λ¬Έμμ΄μ νλ λ μμ ν κ²½μ° del - 1
μ λμΌν encoding κΈΈμ΄λ₯Ό κ°μ§λ€ (μλνλ©΄ λνλ λ¬Έμμ΄μ΄ μκΈ° λλ¬Έμ). - λ°λΌμ κ°μ
dp[len - 1][del - 1]
λ₯Ό κ·Έλλ‘ μ΄λ€.
- κ·Έ λ€μμ νμ¬ λ¬Έμμ΄μ κ°μ₯ λ§μ§λ§ λ¬Έμ
lastChar
μ κΈ°μ€μΌλ‘ λμΌν λ¬Έμμ΄μ λ¨κΈ°κ³ λλ¨Έμ§λ μμ νλ κ²½μ°μ΄λ€ (μ μΌ μ΄ν΄νκΈ° μ΄λ €μ λ λΆλΆ). - λ§μ§λ§ λ¬Έμμ΄λΆν° μμμΌλ‘ μννλ©΄μ λ§€ index
l
λ§λ€ λ§μ§λ§ λ¬Έμ lastChar
μ λμΌν λ¬Έμμ μ (λ¨κΈΈ κ²) addCount
μ λμΌνμ§ μμ λ¬Έμμ μ (μμ ν κ²) delCount
λ₯Ό μΌλ€. - νΉμ index
l
μ κΈ°μ€μΌλ‘ [0, len)
ꡬκ°μ λκ°λ‘ λλλ€ [0, l)
, [l, len)
. - (μ€μ!!) λ ꡬκ°μμ μμ ν λ¬Έμμ μ«μκ°
del
μ΄ λλλ‘ λ§λ λ€. - λ·μͺ½ λΆλΆ
[l, len)
μ addCount
λ§νΌμ λ¬Έμμ΄μ encoding ν κΈΈμ΄κ° κ²°κ³Ό κ°μ΄ λλ€. - μμͺ½ λΆλΆμ λλ¨Έμ§ λ¨μ μμ λ¬Έμ μλ₯Ό μ±μΈ μ μλλ‘ μμ κ³μ°λ ꡬκ°
[0, l)
μ κ²°κ³Ό μ€ del - delCount
μ μμ λ¬Έμ μ«μλ₯Ό κ°μ§ κ² dp[i][del - delCount]
μ μ·¨νλ€.
class Solution {
int getCodedLength(int count) {
if (count <= 1) return 1;
int length = 1;
while (count > 0) {
++length;
count /= 10;
}
return length;
}
public int getLengthOfOptimalCompression(String s, int k) {
int n = s.length();
// (sub string length, deleted character count)
int[][] dp = new int[n + 1][k + 1];
for (int[] sub : dp) {
// fill with maximum + 1 value
Arrays.fill(sub, n + 1);
}
// zero length
dp[0][0] = 0;
for (int len = 1; len <= n; ++len) {
char lastChar = s.charAt(len - 1);
for (int del = 0; del <= k; ++del) {
int addCount = 0, delCount = 0;
for (int i = len - 1; i >= 0; --i) {
if (s.charAt(i) == lastChar)
++addCount;
else
++delCount;
if (del - delCount >= 0) {
// get result of sub string [0, i)
// and add characters in sub string [i, len)
int newValue = dp[i][del - delCount] + getCodedLength(addCount);
dp[len][del] = Math.min(
dp[len][del], newValue);
}
}
if (del > 0) {
// remove current character
dp[len][del] = Math.min(
dp[len][del], dp[len - 1][del - 1]);
}
}
}
return dp[n][k];
}
}