개발/PS

프로그래머스 Lv2 문자열 압축 (파이썬) + 예외 처리

유훈 | Yuhun 2021. 12. 30. 15:40
반응형

풀이

# 주석은 아래 글에서 확인
def solution(s):
    answer = 1000
    if len(s) == 1: # 1
        answer = 1

    for i in range(1, (len(s) // 2) + 1):
        temp = s[0:i]
        c_str = ''
        count = 1
        for j in range(1, 1001):
            if i * j > len(s): 
                c_str += s[i * (j - 1):] # 2
                break
            if temp == s[i * j:i * (j + 1)]:
                count += 1
            else:
                if count == 1:
                    count = 'A' # 3
                c_str += str(count) + temp
                temp = s[i * j:i * (j + 1)]
                count = 1
        c_str = c_str.replace('A', '') # 3_1
        
        if len(c_str) < answer:
            answer = len(c_str)
    return answer

[ ]의 slicing을 이용해 푼 문제입니다. 예외를 생각 못해서 좀 오래 걸렸는데 생각하는데 오래 걸린 부분은 세가지 였습니다.

 

#1. 주어진 s의 길이가 1이면 answer은 무조건 1임을 생각해보시길..

=> 이걸 간과하고 풀어서 테스트 케이스를 몇개 통과 못했었습니다.. 하하..

 

#2. 문자열의 길이가 기준이 되는 압축 길이로 딱 떨어지지 않으면 나머지를 추가해 줘야 합니다.

=> 14개짜리 문자를 3개씩 압축하면 2 문자가 남는데 이걸 마지막에 붙여줘야 합니다. 구현에서 좀 고민이 있었습니다.

 

#3. *** 압축의 길이는 10이 넘어갈 수 있어요. 이것 때문에 시간을 진짜 잡아먹었어요.

=> 저는 처음에 압축이 안되는 문자 앞에는 1을 붙이고 마지막에 replace()로 전부 제거했습니다. 근데 압축이 10을 넘으면 1이 제거되면 당연히 오류가 발생하겠죠? 그래서 결국 압축이 안되는 문자는 A를 붙이고 나중에 전부 제거했습니다..

이 부분이 테스트 5개 중에 없어서 생각하기 어려웠네요. 하지만 채점용 테스트 케이스에는 있으니 주의합시다..

반응형