Leetcode/LeetCode75

[Array/String][Medium] 443. String Compression

자전거통학 2023. 11. 29. 05:51

https://leetcode.com/problems/string-compression

 

String Compression - LeetCode

Can you solve this real interview question? String Compression - Given an array of characters chars, compress it using the following algorithm: Begin with an empty string s. For each group of consecutive repeating characters in chars: * If the group's leng

leetcode.com

 

Q. 입력캐릭터를 다음과 같은 조건에 기반하여 압축하라. 

   - 문자를 출력하고 다음에 해당 문자의 수를 출력하라.

   - 문자가 하나라면, 수는 skip 하라. 

   - Constant extra memory만을 사용하라.

   - 결과는 input buffer를 그대로 사용하고, 결과 buffer의 길이를 출력하라.

 

Comment.

   문제 자체는 평이하지만, 신경써야 할 부분들이 조금 있다. 

   나오는 문자수가 10을 넘는다면, 여러자리로 출력해야 하는 부분들도 그렇다. 

   직관대로 코드를 작성하면 큰 무리가 없다.

 

 

int compress(vector<char>& chars)
{
    // 해당 chars를 압축하라.
    // - 나오는 문자수를 문자후에 출력하라.
    // - 문자가 하나라면, 문자후에 숫자를 생략하라.
    // constant extra space만을 사용하라.
    // 압축한 문자를 input된 buffer에 update하라.
    // 완료되면 이 최종 buffer의 size를 반환하라.
    //
    //
    char target = -1;
    int counter = 0;
    int idx = 0;
    for (int k = 0; k <= chars.size(); ++k)
    {
        char cur = k==chars.size() ? -1 : chars[k];
        if (target < 0)
        {
            target = cur;
            counter = 1;
            ++idx;
        }
        else
        {
            if(target == cur)
                ++counter;
            else
            {
                if (counter > 1)
                {
                    vector<char> vNum;
                    while (counter > 0)
                    {
                        vNum.push_back(counter % 10 + '0');
                        counter /= 10;
                    }
                    for (int q = 0; q < vNum.size(); ++q)
                        chars[idx+q] = vNum[ vNum.size()-1-q ];
                    idx += vNum.size();
                }

                if (k < chars.size())
                {
                    target = cur;
                    chars[idx++] = target;
                    counter = 1;
                }
            }
        }
    }
    return idx;
}