코딩테스트

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

pythaac 2021. 8. 10. 16:14
프로그래머스 코딩테스트 고득점 Kit의 문제입니다.

https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제

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

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

내가 작성한 코드

def solution(s):
    answer = len(s)

    for i in range(1, len(s) // 2 + 1):
        n = len(s)
        words = []

        for start in range(0,len(s),i):
            words.append(s[start:start+i])

        cnt = 1
        for a, b in zip(words, words[1:]):
            if a == b:
                cnt += 1
            elif cnt > 1:
                n = n - ((cnt-1) * i) + len(str(cnt))
                cnt = 1
            else:
                cnt = 1
        if cnt > 1:
            n = n - ((cnt-1) * i) + len(str(cnt))

        answer = min(answer, n)

    return answer

 

  • 1부터 전체 길이의 절반까지 나누는 횟수 지정하여, 자른 문자열들을 words에 append
  • words를 인접한 n-1개 비교
    • 같을 때까지 cnt 증가
    • 다르면 같은 개수를 str로 바꾸고 그 length만큼 +

 

다른 사람이 작성한 코드

def compress(text, tok_len):
    words = [text[i:i+tok_len] for i in range(0, len(text), tok_len)]
    res = []
    cur_word = words[0]
    cur_cnt = 1
    for a, b in zip(words, words[1:] + ['']):
        if a == b:
            cur_cnt += 1
        else:
            res.append([cur_word, cur_cnt])
            cur_word = b
            cur_cnt = 1
    return sum(len(word) + (len(str(cnt)) if cnt > 1 else 0) for word, cnt in res)

def solution(text):
    return min(compress(text, tok_len) for tok_len in list(range(1, int(len(text)/2) + 1)) + [len(text)])
  • 대충 훑어봤는데, 접근 방식은 비슷한 거 같다

 

기억해야할 것

  • 문자열 문제를 많이 풀어야겠다
    • 쉬운 문제인데 머리가 너무 아프다
    • 문제 푸는데 너무 오래걸리고, 인덱스가 너무 헷갈린다 ㅠㅠ
  • 문제를 잘 읽자
    • 앞에서부터 일정한 개수로 잘라야한다는 걸 못봤다
    • 어쩐지 너무 경우의 수가 많았다