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
반응형
'Python' 카테고리의 다른 글
[Python] K-Means 알고리즘 구현(2) (0) | 2023.10.29 |
---|---|
[Python] K-Means 알고리즘 구현(1) (2) | 2023.10.29 |
[Python] 얼굴이미지로 나이분류하기 (0) | 2023.06.25 |
[Python] UDP 예제 (0) | 2023.06.25 |
무작위로 학생 성적 데이터 생성하기 (1) | 2023.06.18 |