Algorithm/Programmers

[Python] 문자열 압축

느낌표 공장장 2021. 5. 20. 18:54
def solution(s):
    answer = 0
    n = len(s)
    result = n
    
    for i in range(1, int(n/2)+1) :
        r = 0
        l = i
        before = s[r:i]
        count = 1
        temp = []
        
        while r < n :
            r += l
            i += l

            if s[r:i] == before :
                count += 1
                before = s[r:i]
                
            else :
                if count > 1 :
                    temp.append(str(count)+ before)
                    count = 1
                else :
                    temp.append(before)
                    
                before = s[r:i]
                
        answer = len(''.join(temp))
        if result > answer :
            result = answer
            
    return result

풀이

1) for문 및 초기 변수 설정

    answer = 0 # 정답이 들어갈 변수
    n = len(s) # s의 길이
    result = n # 결괏값
    
    for i in range(1, int(n/2)+1) :
        r = 0 # 오른쪽 포인트 설정
        l = i # 문자 길이 설정
        before = s[r:i] # 현재 문자의 전 문자
        count = 1 # 얼마나 같은 문자 배열이 반복되는지 기록
        temp = [] # 임시 리스트

answer, n, result 각 변수에 값을 넣어준다.

 

for문은 1부터 n길이의 반까지만 돌게 한다.

 

2) for > while > if

     while r < n :
         r += l
         i += l

         if s[r:i] == before :
             count += 1
             before = s[r:i]
                

① 오른쪽으로 움직이는 포인트(r)가 n까지 돌도록 while문 설정

② while 문을 돌 때마다 r과 i에 l을 더하면서 포인트의 위치를 움직인다. 

 

③ 만약 현재 문자(s[r:i])가 이전 문자와 같다면 count에 1을 더해주고 이전 문자를 업데이트해준다.

 

3) for > while > else

       else :
             if count > 1 :
                 temp.append(str(count)+ before)
                 count = 1
             else :
                 temp.append(before)
                    
             before = s[r:i]

① 만약 현재 문자가 이전 문자와 같지 않다면 (이전 문자 추가하기)

     if ) count > 1이라면 (이전 문자로 압축한 적이 있다면) count(이전 문자 압축 횟수?)와 before(이전 문자)를 temp에 추가한다. 

          그리고 count는 1로 초기화한다.

     else)  count = 1이라면 (이전 문자가 반복 X) temp에 이전 문자를 추가해준다.

② before을 현재 문자로 업데이트해준다.

 

4) for > while 문이 다 돌았을 경우(압축 끝난 경우)

   answer = len(''.join(temp))
   if result > answer :
            result = answer
            
    return result

① answer에 l(또는 i)개 단위로 압축한 문자열의 길이를 받아준다.

② 만약 answer(l개 단위로 압축한 결과)이 result(그 전 단위(l-1)로 압축 결과) 보다 작다면 result를 answer의 값으로 업데이트시켜준다.

③ 그렇게 된다면 가장 짧은 문자열이 정답이 된다.

'Algorithm > Programmers' 카테고리의 다른 글

[Python] 음양 더하기  (0) 2021.05.20
[Python] 폰켓몬  (0) 2021.05.20
[Python] 내적  (0) 2021.05.18
[Python] 이상한 문자 만들기  (0) 2021.05.18
[Python] 약수의 갯수와 덧셈  (0) 2021.05.18