코딩테스트 연습/프로그래머스

[프로그래머스 - Python] 2020 KAKAO BLIND RECRUITMENT > 문자열 압축

슈퍼짱짱 2022. 3. 17. 14:56
반응형

(파이썬으로 코딩테스트 연습) Programmers > 2020 KAKAO BLIND RECRUITMENT > 문자열 압축

 

 

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 


 

Solution

 

def solution(s):
    if len(s)==1 :
        return(1)
    answer = []
    for i in range(1,int(len(s)/2)+1) :
        split_data = [s[z:z+i] for z in range(0, len(s), i)] # 주어진 개수만큼 자르기 
        cnt=1
        result=[]
        result.append(split_data.pop(0))

        while len(split_data)>0 :
            temp = split_data.pop(0)
            if result[-1]==temp :
                cnt+=1
            else :
                if cnt!=1 :
                    result.append(str(cnt))
                cnt=1
                result.append(temp)
        if cnt!=1 :
            result.append(str(cnt))
        answer.append(len("".join(result)))
    return min(answer)

 

문자열을 1개, 2개, 3개, ..., 개수만큼 잘라서 결과값을 비교했다.

문자열개수만큼 다 확인할 필요는 없고 (문자열개수/2)+1개 까지만 비교하면된다.

(전체길이/2) 한 것 보다 많은 개수가 반복될 수는 없기 때문이다.

 

주어진 문자열의 길이가 1개일때는 바로 1을 return해준다.

아래 for문의 범위가 range(1, int(len(s)/2)+1)이기때문에 len(s)가 1일때는 for문 안에 내용을 실행하지 못한다. 그럼 answer이 빈 리스트이므로 마지막 min(answer)에서 런타임 에러가 발생한다.

 

split_data = [s[z:z+i] for z in range(0, len(s), i)]은 문자열을 i만큼 잘라서 결과를 리스트로 저장한다.

 

 

 

result는 각 문자가 몇 번 반복됐는지 저장하고 answer는 최종적으로 압축된 글자수를 저장한다.

다음은 s가 "abcabcabcabcdededededede" 일때 i에 따른 result와 len("".join(result))에 대한 결과이다.

 

 

i=6일 때 abcabc가 두 번 반복되고, dedede가 2번 반복된다.

단, 1번만 반복되었을 때는 1이라는 값은 저장하지 않는다.

 

이 result의 결과를 합쳐서 글자수를 세어주어 answer이라는 리스트에 모두 저장하고, 그 중 가장 작은 값을 return한다.

 


 

다른 사람의 풀이

 

 

전반적인 로직은 비슷하나, 코드가 좀 더 깔끔하다.

 

text와 몇 개 단위로 자를지를 입력으로 받아 결과를 return하는 함수를 compress라는 이름으로 따로 짜고, 

solution에서 for문을 통해 결과를 return했다. 

결과는 따로 list에 담지않고, min()으로 바로 return한다.

 

입력받은 text 길이가 1개일 경우를 대비하여 마지막에 [len(text)]를 추가했다.

이를 해주지 않으면 for문 range 중 int(len(text/2))+1이 1이므로 for문을 통화하지 못하고 compress()함수를 실행하지 못한다.

따라서 빈값이 return된다.

 

 


 

compress 함수를 자세히 살펴보면

text="abcabcabcabcdededededede", tok_len=2라 할 때

 

words는 다음과 같고,

 

for문에 a와 b가 될 iter는 다음과 같다. 

 

 

for문에 a,b에 따른 cur_word와 cur_cnt는 다음과 같다.

 

 

최종 res와 result(압축된 길이)도 위 이미지에 있다.

 

즉, 현재값과 다음값이 같으면 cnt는 +1되고, 다르면 현재값과 cnt를 res에 저장한다.

반응형