Programmers 문자열 압축 Level 2 - python

유형석·2022년 7월 23일
0

python/Algorithm

목록 보기
4/9
post-thumbnail
def solution2(s, cnt):
    str_list = []
    result_str = ''
    tmp = 1
    for p in range(0, len(s) + 1, cnt):
        start, end, end2 = p, p + cnt, cnt + (p + cnt)
        if s[start:end] == s[end:end2]:
            tmp += 1
        else:
            str_list.append([s[start:end], tmp])
            tmp = 1
    return ''.join([i[0] if i[1] == 1 else (str(i[1]) + i[0]) for i in str_list])

def solution(s):
    if len(s) == 1:
        return 1
    max_len = len(s) // 2
    return len(min([(solution2(s, x)) for x in range(1, max_len + 1)], key=len))


a = ["aabbaccc", "ababcdcdababcdcd", "abcabcdede", "abcabcabcabcdededededede", \
     "xababcdcdababcdcd", "a"]
for i in a:
    print(solution(i))

preview

코드를 보면 가독성이 떨어진다
처음에는 이런 형식이 아니였지만 완성 후 자체적으로 comprehension을 최대한 활용해보고
싶어서 열심히 줄여봤다.
level2 라서 간단할 줄 알았지만 생각보다 애먹고 result_str 부분은 정답을 보고 참고하였다.

code

def solution2(s, cnt):
    str_list = []
    result_str = ''
    tmp = 1
    for p in range(0, len(s) + 1, cnt):
        start, end, end2 = p, p + cnt, cnt + (p + cnt)
        if s[start:end] == s[end:end2]:
            tmp += 1
        else:
            str_list.append([s[start:end], tmp])
            tmp = 1
    return ''.join([i[0] if i[1] == 1 else (str(i[1]) + i[0]) for i in str_list])

def solution(s):
    if len(s) == 1:
        return 1
    max_len = len(s) // 2
    return len(min([(solution2(s, x)) for x in range(1, max_len + 1)], key=len))

풀이

max_len = len(s) // 2

시작은 문제에 나와있듯 앞 첫 글자부터 시작한다
2개 단위의 글자 압축부터 시작하기 때문에 위와같이 max_len 값을 전체 길이의 2로 나누어 주었다.

return 부분
for x in range(1, max_len + 1)
	result.append(olution2(s, x))
len(min(result, key=len))
-> listcomprehension
return len(min([solution2(s, x) for x in range(1, max_len + 1)], key=len)

풀어 쓰면 위와 같다
solution2 는 cnt에 2 ~ (len(s) // 2 + 1) 까지의 숫자를 1씩 늘리며 얼마나 어디까지 압축되는지의 코드이다.

  • 포인트
    딱히 없는 것 같다.
    기본기가 탄탄하지 못해서 과부화 걸려서 잘 못풀었다.
profile
Carrot_hyeong

0개의 댓글