https://programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
길이별로 문자열의 압축을 진행하고 그 결과의 길이를 비교하여 최솟값을 반환합니다.
- solution
- 길이가 1 인 경우, 아무 작업도 수행하지 않고 문자열을 그대로 반환합니다
- 길이가 2 이상인 경우, 1부터 "문자열의 길이-1"까지 숫자를 증가시키며 문자열 압축을 시도하고 최솟값을 반환합니다
- compress
- 문자열을 특정한 길이로 압축합니다
- 문자열을 일정한 길이로 잘라 chunks에 넣어줍니다
- 압축결과를 담을 비어있는 리스트 compressed 를 준비합니다
- 각 문자덩어리 chunks[i] 를 다음 문자덩어리 chunks[i+1] 와 확인합니다
- 두 문자덩어리가 같다면 cnt를 1 증가시킵니다
- 다르다면 더이상 압축을 진행할 수 없습니다
- cnt가 2 이상이라면 결과에 cnt를 추가합니다 (cnt가 1이라면 결과에 cnt를 추가하지 않습니다)
- 현재 문자덩어리 chunks[i] 를 결과 compressed 에 추가하고 cnt를 1로 초기화합니다 (해당 문자덩어리를 사용한 압축이 종료되었습니다)
- 앞선 반복문에서 처리하지 못한 가장 마지막 문자덩어리 chunks[i+1] 를 처리합니다
- cnt가 2 이상이라면 결과에 cnt를 추가합니다
- 가장 마지막 문자덩어리 chunks[i+1] 를 결과에 추가합니다
- 압축결과를 문자열로 변환하고 길이를 반환합니다
- 문자열을 특정한 길이로 압축합니다
def solution(s):
if len(s) < 2:
ans = len(s)
else:
ans = min([compress(s, x) for x in range(1, len(s))])
return ans
def compress(s, num):
chunks = [s[x : x + num] for x in range(0, len(s), num)]
cnt = 1
compressed = []
for i in range(len(chunks) - 1):
if chunks[i] == chunks[i + 1]:
cnt += 1
else:
if cnt > 1:
compressed.append(str(cnt))
compressed.append(chunks[i])
cnt = 1
if cnt > 1:
compressed.append(str(cnt))
compressed.append(chunks[i + 1])
return len("".join(compressed))
반응형
'알고리즘' 카테고리의 다른 글
[BOJ] 18405번: 경쟁적 전염 (파이썬) (0) | 2022.04.16 |
---|---|
[BOJ] 18352번: 특정 거리의 도시 찾기 (파이썬) (0) | 2022.04.16 |
[프로그래머스] 기둥과 보 설치 (파이썬) (0) | 2022.04.16 |
[BOJ] 3190번: 뱀 (파이썬) (0) | 2022.04.16 |