[프로그래머스 LV2] 문자열 압축

Junyoung Park·2022년 2월 22일
0

코딩테스트

목록 보기
68/631
post-thumbnail

1. 문제 설명

문자열 압축

2. 문제 분석

i 길이의 문자열을 구한 뒤, 반복 가능한 최대 횟수를 카운트해 이중 최솟값을 return하는 문제다. 문자열을 조작하는 방법을 익히는 데 연습이 되는 문제로 for 문이 끝난 뒤 s_pre에 남아 있는 카운트까지 확인해주는 게 문제를 푸는 소소한 포인트.

  1. 압축 단위 길이는 1(압축 X)부터 전체 문자열 길이의 절반까지다.
  2. 단위 길이만큼 앞에서 잘라 s_pre라는 비교 가능한 단위를 만들어내자.
  3. 스텝 사이즈만큼 건너뛰며, s_pre가 총 몇 번 반복적으로 나오는지, 다시 말해 압축 가능한지 카운트한다.
  4. 반복되지 않다면 그 자리에서 s_pre를 다시 세면서 마지막 문자열까지 확인한다.
  5. 단위 길이를 모두 확인해가면서 각 단위 별로 압축했을 때 얻을 수 있는 총 길이를 비교해 최솟값을 return.

3. 나의 풀이

def solution(s):
    
    answer = []
    
    if len(s) == 1: return 1
    
    for i in range(1, len(s)//2+1):
        # 압축 가능한 단위는 최대 전체 문자열 길이의 절반 (aa -> a/a 등)
        result = ''
        cnt = 1
        s_pre = s[:i]
        # s_pre는 앞에서 i번째 캐릭터까지
        for j in range(i, len(s), i):
            if s_pre == s[j:i+j]:
                cnt += 1
                # s_pre가 공통적으로 발견된다면 압축 가능
            else:
                if cnt != 1:
                    result += str(cnt) + s_pre
                    # 가능한 길이로 압축
                else:
                    result += s_pre
                    # 반복 없을 때에는 숫자 표시 X
                s_pre = s[j:i+j]
                cnt = 1
                # 길이 i 단위의 새로운 문자열 s_pre로 다음 문자열부터 검사한다.
                
        if cnt != 1:
            result += str(cnt) + s_pre
        else:
            result += s_pre
            # 위 for 문에서 s_pre 카운트가 남아 있을 때 결과값에 붙인다.
        answer.append(len(result))
        # 길이 i로 반복 압축했을 때 주어진 문자열을 len(result) 길이로 줄일 수 있다. 최소 길이를 return하자.
    return min(answer)
profile
JUST DO IT

0개의 댓글