코딩테스트/프로그래머스

[프로그래머스] [2020 KAKAO BLIND RECRUITMENT] 문자열 압축

박소민 2023. 2. 4. 17:12
문자열 압축
 

프로그래머스

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

programmers.co.kr

 

 

  • 내 풀이 -
    • 2,5,20 fail
    • 테스트 5
      • 문자열 길이가 1인경우
    • 테스트 2,20
      • 맨마지막에서 다를경우 계산 에러
def count(num):
    #개수를 센 수의 길이 : 1~9: 1 / 10~99: 2...
    if num==0:
        same=0
    elif num<10:
        same=1
    elif num<100:
        same=2
    elif num<1000:
        same=3
    
    return same

def solution(s):
    answer=1001
    for i in range(1,(len((s))//2)+1):
        ls=""
        cnt=0
        result=0
        for j in range(0,len(s),i):
            if j==0:
                ls=s[j:j+i]
                continue
            if ls==s[j:j+i]:
                cnt+=1
                if len(s[j:])==i: #마지막에 값이 같을 경우
                    same=count(cnt)
                    result+=same
                    result+=i
                    break
                continue
                
            #개수를 센 수의 길이 : 1~9: 1 / 10~99: 2...
            same=count(cnt)
            #앞의 값들 개수
            result+=same
            result+=i
            cnt=0
            
            if len(s[j:])==i: #다음이 마지막인데 앞과 다를 경우
                result+=len(s[j:])
                break
            
            ls=s[j:j+i]
            
            if len(s[j:])<i:
                result+=len(s[j:])
        
        answer=min(answer, result)
                   
    return answer

 

 

 

  • 내 풀이
def count(num):
    #개수를 센 수의 길이 : 1~9: 1 / 10~99: 2...
    if num<=1:
        same=0
    elif num<10:
        same=1
    elif num<100:
        same=2
    elif num<1000:
        same=3
    
    return same

def solution(s):
    answer=1005
    if len(s)<=1: 
        return len(s)
    
    for i in range(1,(len((s))//2)+1):
        ls=""
        cnt=1
        result=0
        for j in range(0,len(s),i):
            if j==0:
                ls=s[j:j+i]
                continue
                
            if ls==s[j:j+i]:
                cnt+=1
                if len(s[j:])==i: #마지막에 값이 같을 경우
                    same=count(cnt)
                    result+=same
                    result+=i
                    break
                continue
                
            #값이 다른경우
            
            same=count(cnt)
            #앞의 값들 개수
            result+=same
            result+=i
            cnt=1
            
            ls=s[j:j+i]
            
            if len(s[j:])<=i: #값이 다른데 마지막일경우
                result+=len(s[j:])
                continue

        answer=min(answer, result)
                   
    return answer