본문 바로가기
Python

[python] Txt파일을 읽어서 알파벳 갯수만큼 정렬하여 암호화 및 복호화하는 방법

by 돌맹96 2023. 10. 8.
728x90
반응형

문제는 다음과 같다.

 

만약 AAABBBBCCCCC라고 txt파일에 적혀있다면, A의 갯수는 3개 B는 4개 C는 5개가 될것이다.

{A : 3, B : 4, C : 5} 이런식으로 dict으로 만들고 갯수에 따라 정렬을해 {C: 5, B: 4, A:3}이런식으로 만든뒤 A->C로 B->B C->A로 암호화 및 복호화하는 문제를 파이썬으로 풀어보려고한다.

함수를 만드는 순서는 다음과 같다.

1. Txt를 읽는 함수를 만든다

2. alpha를 제외한 특수 문제 제외 함수를 만든다

3. 알파벳의 갯수를 세는 함수를 만든다

4. 암호화하는 함수를 만든다.

5. 복호화하는 함수를 만든다.

 

이제 순서대로 함수를 만들어 보겠다.

# Txt 읽는 함수
def readTxt(filepath):
    with open(f'{filepath}', 'r') as file:
        content = file.read()
        list_content = list(content)
        return list_content

 

# alpha을 제외한 특수 문자 제외 함수
def fillterEng(list_content):
    result = []
    for i in list_content:
        if(i.isalpha()):
            result.append(i)
    return result

 

# alpha count -> AABBBCCCC {A:2, B:3,C:4}
def alphaCount(result):
    counter = Counter(result)
    print(counter)
    sorted_alphabets = [item[0] for item in counter.most_common()]
    return sorted_alphabets

 

# 암호화
def Encryption(sorted_alphabets, result):
    replace_dict = {}
    labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
              'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
              'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

    for idx, alphabet in enumerate(sorted_alphabets):
        if idx < len(labels):
            replace_dict[alphabet] = labels[idx]

    replaced_result = [replace_dict[char] if char in replace_dict else char for char in result]
    return replaced_result, replace_dict

 

#복호화
def Decoding(encrypted_text, replace_dict):
    reversed_dict = {v: k for k, v in replace_dict.items()}  # Reverse the dictionary for decoding
    decoded_result = [reversed_dict[char] if char in reversed_dict else char for char in encrypted_text]
    return decoded_result

 

전체코드

from collections import Counter

# Txt 읽는 함수
def readTxt(filepath):
    with open(f'{filepath}', 'r') as file:
        content = file.read()
        list_content = list(content)
        return list_content


# alpha을 제외한 특수 문자 제외 함수
def fillterEng(list_content):
    result = []
    for i in list_content:
        if(i.isalpha()):
            result.append(i)
    return result

# alpha count
def alphaCount(result):
    counter = Counter(result)
    print(counter)
    sorted_alphabets = [item[0] for item in counter.most_common()]
    return sorted_alphabets

# 암호화
def Encryption(sorted_alphabets, result):
    replace_dict = {}
    labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
              'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
              'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

    for idx, alphabet in enumerate(sorted_alphabets):
        if idx < len(labels):
            replace_dict[alphabet] = labels[idx]

    replaced_result = [replace_dict[char] if char in replace_dict else char for char in result]
    return replaced_result, replace_dict

#복호화
def Decoding(encrypted_text, replace_dict):
    reversed_dict = {v: k for k, v in replace_dict.items()}  # Reverse the dictionary for decoding
    decoded_result = [reversed_dict[char] if char in reversed_dict else char for char in encrypted_text]
    return decoded_result



result = readTxt('alphabet.txt')
filter_result = fillterEng(result)
sorted_alphabets = alphaCount(filter_result)
encrypted_text, encryption_mapping  = Encryption(sorted_alphabets, filter_result)
decrypted_text = Decoding(encrypted_text, encryption_mapping)

print("Encrypted:", ''.join(encrypted_text))
print("Decrypted:", ''.join(decrypted_text))

결과

728x90
반응형