[파이썬] 문자열 알고리즘의 응용과 압축 알고리즘

소개

문자열은 컴퓨터 과학에서 가장 일반적으로 다루어지는 데이터 유형 중 하나입니다. 문자열 알고리즘은 문자열을 다루는 데 사용되는 다양한 알고리즘들을 의미합니다. 이러한 알고리즘들은 문자열을 탐색, 변경, 분석하는 데 사용됩니다. 이 글에서는 문자열 알고리즘의 응용에 대하여 알아보고, 특히 문자열 압축 알고리즘에 초점을 맞춰 설명하겠습니다.

문자열 압축 알고리즘

문자열 압축 알고리즘은 문자열의 크기를 줄이는 알고리즘입니다. 이는 데이터를 더 효율적으로 저장하거나 전송하기 위해 사용될 수 있습니다. 문자열 압축은 데이터 압축의 기본 원리를 적용한 것으로, 중복되는 문자 또는 패턴을 인식하고 압축하여 표현하는 것입니다.

Run-Length Encoding (RLE)

Run-Length Encoding (RLE)는 가장 간단한 문자열 압축 알고리즘입니다. 이 알고리즘은 연속해서 나타나는 문자와 그 개수를 저장하고, 복원할 수 있는 형태로 문자열을 압축합니다.

예를 들어, 문자열 “AAAABBBCCDAA”를 RLE로 압축하면 “4A3B2C1D2A”와 같이 표현됩니다. 이는 연속해서 4개의 ‘A’, 3개의 ‘B’, 2개의 ‘C’, 1개의 ‘D’, 그리고 2개의 ‘A’로 구성되어 있다는 뜻입니다.

def rle_compress(string):
    compressed = ""
    count = 1
    for i in range(len(string)):
        if i < len(string) - 1 and string[i] == string[i+1]:
            count += 1
        else:
            compressed += str(count) + string[i]
            count = 1
    return compressed

def rle_decompress(string):
    decompressed = ""
    for i in range(0, len(string), 2):
        count = int(string[i])
        decompressed += string[i+1] * count
    return decompressed

# 예시
original_string = "AAAABBBCCDAA"
compressed_string = rle_compress(original_string)
decompressed_string = rle_decompress(compressed_string)

print("Original:", original_string)
print("Compressed:", compressed_string)
print("Decompressed:", decompressed_string)

위 코드에서 rle_compress() 함수는 문자열을 RLE로 압축하고, rle_decompress() 함수는 압축된 문자열을 복원합니다. 예시로 주어진 문자열 “AAAABBBCCDAA”를 압축하고 복원한 결과를 출력합니다.

Huffman Coding

Huffman Coding은 문자열의 빈도와 길이를 고려하여 압축하는 알고리즘입니다. 이 알고리즘은 자주 등장하는 문자에 더 짧은 코드를 할당하고, 드물게 등장하는 문자에는 더 긴 코드를 할당하여 압축률을 최적화합니다.

Huffman Coding은 트리 기반의 구조를 사용하여 문자에 대한 코드를 만듭니다. 이 트리는 문자열에서 많이 등장하는 문자일수록 더 가까운 위치에 배치되어 짧은 코드를 가집니다. 따라서, 압축된 문자열은 트리의 구조 및 코드 테이블을 이용하여 복원될 수 있습니다.

Python에서는 huffman 라이브러리를 사용하여 Huffman Coding을 구현할 수 있습니다. 라이브러리를 설치한 후 아래 예시 코드를 실행해보세요.

import huffman

# 예시
original_string = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"
compressed_string, codebook = huffman.compress(original_string)
decompressed_string = huffman.decompress(compressed_string, codebook)

print("Original:", original_string)
print("Compressed:", compressed_string)
print("Decompressed:", decompressed_string)
print("Codebook:", codebook)

위 코드에서 compress() 함수는 문자열을 Huffman Coding으로 압축하고, decompress() 함수는 압축된 문자열을 복원합니다. 예시로 주어진 문자열 “THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG”을 압축하고 복원한 결과를 출력합니다. 또한, 코드 테이블 codebook을 출력하여 문자와 압축 코드를 확인할 수 있습니다.

결론

문자열 알고리즘의 응용과 문자열 압축 알고리즘에 대해서 알아보았습니다. 문자열 압축 알고리즘은 데이터 유형 중 하나인 문자열을 더 효율적으로 저장하거나 전송하기 위해 사용됩니다. 이 글에서는 간단한 예제인 Run-Length Encoding과 더 복잡한 알고리즘인 Huffman Coding에 대하여 알아보았습니다. 각 압축 알고리즘은 다양한 케이스에 따라 적절한 선택이 되어야 합니다. 압축 알고리즘을 사용하여 데이터를 압축하고 복원하는 방법을 익혀두면 데이터 처리 및 저장에서 큰 도움이 될 것입니다.