파이썬 알고리즘 238번 | [Programmers 2020 KAKAO BLIND RECRUITMENT 문자열 압축]

Yunny.Log ·2022년 8월 15일
0

Algorithm

목록 보기
242/318
post-thumbnail

238. Programmers 2020 KAKAO BLIND RECRUITMENT 문자열 압축

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

1) 어떤 전략(알고리즘)으로 해결?

  • 문자열 처리

2) 코딩 설명

  • 이전 문자열과
  • 주석으로 설명 존재

<내 풀이>

def solution(s):
    s=list(s)
    answer = 10001

    for i in range(1, len(s)+1) :# 자름 가능 간격 경우  1개부터 문자열 길이까지 
        beforestr="" #이전 문자열 
        tot = "" # 최종 문자열 
        cnt = 0

        for j in range(0, len(s)+1,i) : # 1 2 3 4 5 6 간격 2 라면 , 1-3-5 일캐

            if j+i>len(s) : # 만약 마지막 넘어가면 (이 예외처리 필수인가 검증 필요)
                strr = "".join(s[j:len(s)])
            else : 
                strr = "".join(s[j:j+i])
            
            if beforestr == strr : # 이전 문자열과 동일하면 
                cnt+=1 
            else : 
                if cnt>1 :
                    tot+=str(cnt)
                    tot+=beforestr
                else : 
                    tot+=beforestr

                if j+i>len(s) : # 예외처리 필요 ! 이거 안하면 마지막 차례인 문자열 안붙음 
                    tot+=strr

                cnt = 1 # 이제 새로운 시작이니깐 cnt 초기화
                beforestr = strr # 이전 문자열을 strr로 갱쉰

        # print("tot " ,tot)
        if len(tot)<answer :
            answer = len(tot)
    return answer

<반성 점>

  • 그리고 마지막 예외처리를 계속해줬어야 함
  • 처음에 문제 이해를 잘못해서 사전으로 접근했었는데 틀렸다.
    왜냐하면 ab ab ba ab 이렇게 있을 때
    3ab(1)ba 이렇게 표현되는 것이 아니고 < (1) 은 생략되는 건데 표기 위해서 명시해 줌>
    2ab(1)ba(1)ab 이렇게 표현되어야 하기 때문이지.
    그래서 사전 안쓰고 리스트 + 문자열로만 처리 !

<배운 점>

0개의 댓글