Python/알고리즘

[프로그래머스] 문자열 압축(Python)

안용감한호랑이 2023. 9. 27. 19:48

최근 프로젝트 마무리 및 이직 준비 등으로 코테를 다시 볼 일이 생겨

개인 프로젝트들과 블로그 작성을 잊고 있다가

취준때 풀었던 코드와 비교하는게 재미있어 기록용으로 남겨놓기 위해 작성했습니다.


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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

3년전 코드

def solution(s):
    
    if(len(s) == 1):
        return 1
    
    len_list = []
    
    count = 1
    for i in range(1, round(len(s))):
        count = 1
        temp_string = ""
        for j in range(0, len(s)):
            if(s[i*j : i*(j+1)] == "" and s[i*(j+1) : i*(j+2)] == ""):
                break

            if(s[i*j : i*(j+1)] == s[i*(j+1) : i*(j+2)]):
                count += 1
            else:
                if(count == 1):
                    temp_string = temp_string + s[i*j : i*(j+1)]
                    count = 1
                else:
                    temp_string = temp_string + str(count) + s[i*j : i*(j+1)]
                    count = 1

        len_list.append(len(temp_string)) 

    return min(len_list)

지금 기억나는건 당시 한줄 한줄 print찍어가며 풀고나서 로직을 생각하기 보단 구현에만 신경을 썼던것 같다.

솔...직하게 지금 봐도 어떤 의미인지 잘 모르겠다...

 

 

오늘 작성한 코드

def solution(s):
    # 압축 불가능인 경우 answer는 s의 길이
    answer = len(s)


    # 한번 압축할때 가장 큰 단위로 압축하는 경우는 절반이기 때문에
    # 문자열 s의 절반까지 loop
    # 자를 단위 : x
    for x in range(1, len(s)//2 +1):
        
        # 나눌 문자열의 처음 개수는 1개
        # s를 압축한 결과 : sZip을 ''로 초기화
        count = 1
        sZip  = ''

        # 문자열 loop
        # x가 문자열을 자르는 단위 이기 때문에 step = x
        for index in range(0, len(s), x):

            # 현재 문자열
            now  = s[index:index+x]

            # 현재 문자열 == 다음 문자열
            if now == s[index+x : index+2*x]:
                # 문자열의 중복 건수 1 추가
                count += 1
            # 현재 문자열 != 다음 문자열
            else:
                # 문자열이 압축이 안되는 경우
                if count == 1:
                    sZip += now
                # 문자열이 압축이 가능한 경우
                else:
                    sZip += str(count) + now
                
                # 다음 문자열을 현재 문자열로 변경
                # 현재 문자열이 변했으니 count = 1로 초기화
                now   = s[index+x:index+2*x]
                count = 1
        # sZip은 압축된 결과이기 때문에
        # answer와 압축된 결과 길이를 비교
        answer = min(answer, len(sZip))

    return answer

단순 구현에 초점을 두지 않고 최대한 생각한 방향으로 구현을 했다.

 

생각한 순서

1. 압축 할수 있는 경우의 수

range(1, len(s)//2 + 1) 로 제한 된다는것을 알게되었다.

 

2. 압축하면 어떻게 문자열 안에서 loop할것인가

range(0, len(s), x) 로 문자열을 자르는 단위로 step을 가져가도록 하였다.

 

3. 현재 문자열과 다음 문자열, 다다음 문자열과 비교

현재 문자열과 다음 문자열이 다르면 현재 문자열을 변경해 주면 되지만

만약 같다면 현재 문자열과 다다음 문자열의 비교는 다음 문자열과 다다음 문자열간의 비교와 동일할것이다.