[파이썬 실습] 심화 문제_문자열 데이터 압축하기
문자열 데이터 압축하기
데이터를 압축하는 방법으로는 다양한 알고리즘이 존재합니다.
그 중에 Run-length encoding (이하 RLE)은 연속되어 같은 문자가 반복될때 어떤 문자가 몇번 반복되는지로 압축하여 표현하는 방법입니다.
예를 들어, “aaaaaabbbcccccbbbbb” 라는 19개의 문자 데이터는 a가 6번, b가 3번, c가 5번, b가 5번 연속되어 나타납니다. 이는 “a6b3c5b5” 이렇게 8개의 문자로 압축하여 표현할 수 있습니다.
하지만 “aabb” 이렇게 2번 이하로 반복되는 문자는 “a2b2” 이렇게 바꿔서 표현해도 길이는 줄어들지 않기 때문에 이는 그대로 “aabb”로 표현하고자 합니다.
즉, “aaabbccccaabbbb”이런 문자열을 이 알고리즘을 이용하여 압축하면 “a3bbc4aab4” 이렇게 표현할 수 있습니다.
이 알고리즘을 이용하여 ‘A’부터 ‘Z’까지 26개의 대문자 알파벳으로 구성된 문자열을 압축하는 파이썬 프로그램을 만들려고 합니다.
지시사항에 따라 프로그램를 완성시키세요.
지시사항
동작과정
- 사용자는 A부터 Z까지 대문자 알파벳으로만 구성된 문자열을 입력합니다.
입력예시
AAAAABBCCCDDDZZZWW
Copy
- 이 문자열을 위에서 설명한 RLE 방식으로 압축합니다.
- 압축된 문자열을 출력합니다.
A5BBC3D3Z3WW
Copy
주의사항
- 대소문자 구별에 유의하세요.
정답
def encode(text): #원본 문자열을 AAC4B4와 같은 형태의 압축된 문자열로 만들어주는 함수
# 코드를 작성하세요 #
code = ''
i=1
count = 1
while i < len(text):
if text[i] == text[i-1]:
count+=1
else :
if count > 2 : code += f'{text[i-1]}{count}'
else : code += text[i-1]*count
count = 1
if i == len(text)-1:
if count > 2 : code += f'{text[i-1]}{count}'
else : code += text[i]*count
# print(count)
i+=1
return code #code:압축된 코드
text=input() #사용자는 대문자 알파벳들로만 구성된 문자열을 입력
print(encode(text)) #압축된 코드를 출력
심화 문제에서 8번 9번 문제가 제일 어려운 것 같습니다.
나머지는 쉽게 풀었는데 8번 9번은 안 풀리는 부분이 있어서 질문하기 찬스를 썼습니다!!😂
이 정답 쓰기 전에 코드는 아래의 문자열을 입력을 했을 때는 잘 나왔지만
AAAAABBCCCDDDZZZWW
BBBBKLLW
이와 같이 마지막에 중복되는 글자 없이 하나인 경우에 답이 안 나왔습니다.
해결방안으로는
i가 입력값의 마지막 반복문이 아닐 경우에는 text[i-1]의 문자를 반복해주었고
else : code += text[i-1]*count
i가 입력값의 마지막 반복문일 경우에는 text[i]의 문자를 반복해주었습니다.
else : code += text[i]*count
-1을 해주냐 안 해주냐에 따라 점수가 60점이었다가 100점이었다가 그러네요.
그리고 파이썬에도 자바스크립에 템플릿 리터럴이랑 비슷한 게 있더라고요.
f'{text[i-1]}{count}'
이렇게 작성하면 됩니다.