C++ 학습/C++ 코딩인터뷰[6장]

[6. 문자열] 6.11 반복 길이 부호화로 문자열을 압축/해제하기

msugi 2025. 2. 13. 10:37

[해당 문제는 266가지 문제로 정복하는 코딩 인터뷰]
책의 내용의 문제와 풀이를 베이스로 공부하는 내용이다. 

문제를 풀기전에 단순하게 문제를 푸는것이 목적이 아닌
시간복잡도와 공간복잡도의 관계를 계산하며,
자료구조의 이해도와 실력을 향상하는데 목적이 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Q6.h"
 
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
    os << "[";
    for (size_t i = 0; i < vec.size(); i++)
    {
        os << vec[i];
        if (i != vec.size() - 1)
        {
            os << ", ";
        }
    }
    os << "]";
    return os;
}
 
cs
 
// main에서 vector 형태로 출력하기위한 기본 셋팅
 

 


Q 6.11 반복 길이 부호화로 문자열을 압축/해제하기
반복 길이 부호화(RLE) 는 압축 및 해제를 실시간으로 수행할 수 있는 효과적인 압축 방법이다.
해당방법은 다음과 같다.
실제 문자열 대신 문자와 해당 문자의 연속 등장 횟수를 함께 써 주면 된다.

예를 들어 "aaaabcccaa"를 RLE로 압축하면 "4a1b3c2a" 가 되며,
"3e4f2e"를 압축 해제하면 "eeeffffee" 가 된다.


해당 문제의 소스코드와 결과는 다음과 같다.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 6.11 반복 길이 부호화로 문자열을 압축/해제하기
#include
 <string>
std::string Decoding(const std::string& s)
{
    int count = 0;
    std::string result;
    for (const char& c : s)
    {
        if (isdigit(c))
        {
            count = count * 10 + c - '0';
        }
        else
        {
            result.append(count, c);
            count = 0;
        }
    }
    return result;
}
 
std::string Encoding(const std::string &s)
{
    std::string result;
    for (int i = 1, count = 1; i < size(s); i++)
    {
        if (i == size(s) || s[i] != s[i - 1])
        {
            result += std::to_string(count) + s[i - 1];
            count = 1;
        }
        else
        {
            count++;
        }
    }
    return result;
}
cs

문자열의 길이를 n이라고 했을 때 전체 시간 복잡도는 O(n)이다.

1
2
// main
std
::cout << "6-11 " << Encoding("aaaabccaa"<< std::endl//6-11
std::cout << "6-11 " << Decoding("4a1b2c2a"<< std::endl//6-11
cs

결과