새소식

Computer Science/코딩테스트 문제 풀이

[N시간만에 끝내는 Python 코딩테스트] 12편 : 2020 카카오 코딩테스트 1번 문자열 압축

  • -

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

 

프로그래머스

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

programmers.co.kr

 

https://www.youtube.com/watch?v=Whqda4W-NgI

 


강의에서 제안한 코드 

이 코드는 import re에 익숙해야하고 뭔가 더 복잡한거 같다.

import re 

def solution(s):
    if len(s) == 1: # 이거 안하면 테스트 5에서 실패 
        return 1    # 문자열이 하나 들어왔을때 생각해야함 
    length_str = []
    for i in range(1, len(s)//2+1):     # 슬라이스 크기 (1씩 끊고, 2씩 끝고...)
        pattern = f'[a-z]{{{i}}}'       # 영문자열을 i개씩 끊어서 나눔 
        pattern = re.compile(pattern)
        compressed_str = ''
        split_str = pattern.findall(s)
        count = 1
        for j in range(len(split_str)-1):
            if split_str[j] == split_str[j+1]:  # 앞과 다음게 같아? 반복돼? 
                count += 1
            # 아니면 이제 붙여줘.
            else:
                if count > 1:
                    compressed_str += f'{count}{split_str[j]}'
                    count = 1   # 다시 count=1로 초기화 다음을 위해 
                else:   # 만약 count가 1이면 
                    compressed_str += f'{split_str[j]}'    # count 숫자는 빼고 삽입
            
            # 맨 마지막 이전 문자열과 맨 마지막 문자열 비교를 위해 -2  
            if j == len(split_str)-2:  #   예를 들어 aabbaccc 경우와 2개씩 자른 경우 
                if count > 1:           # 2개 이상 붙어 있으면                  
                    if split_str[j] == split_str[j+1]:       # ac와 cc를 비교 
                        compressed_str += f'{count}{split_str[j]}' # 추가해서 넣어줘
                else:   # 만약 하나짜리면 (cc 하나짜리) 그냥 넣어줘
                    compressed_str += f'{split_str[j+1]}'  # 맨 마지막 남은 cc
        
        if len(s) % i != 0:
            compressed_str += s[-(len(s)%i):]   # 자르고 남은거 붙여주기 
            
        length_str.append(len(compressed_str))


    return min(length_str)

 

두번째 방법이 더 나은거 같다. 

밑에 두번째 방법을 보자 


def solution(s):
    min_len = len(s)
    for i in range(1, len(s)//2 + 1):   # 절반만 보면 된다
        new_s = ''
        cnt = 1
        for j in range(0, len(s), i):
            if s[j:j+i] == s[j+i:j+2*i]:
                cnt += 1
            else:
                if (cnt != 1):		# 2이상이면 
                    new_s += str(cnt)	# 숫자를 붙이고 
                new_s += s[j:j+i]		# 문자를 붙이면 된다. 자연스럽게 하나짜리는 문자만 붙어짐
                cnt = 1

        min_len = min(min_len, len(new_s))

    return min_len
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.