Python/알고리즘

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

vss121 2022. 7. 10. 00:57

어려웠다!!!!

# 복습

1회 22-07-10
2회  
3회  
4회  
5회  

 

 

# 오답 

def solution(s):

    res=list()
    for j in range(1, len(s)//2+1):
        cnt=1
        ss=""
        for i in range(0,len(s)-1,j):
            if s[i:i+j]==s[i+j:i+2*j]:
                cnt+=1
            else:
                if cnt==1:
                    ss+=s[i:i+j]
                else:
                    ss+=str(cnt)+s[i:i+j]
                cnt=1
        if j==1:    #??
            ss+=s[len(s)-1]
        #print(ss)
        res.append(ss)
    res_cnt=list()
    for x in res:
        res_cnt.append(len(x))
    #print(res)
    #print(min(res_cnt))
    return min(res_cnt)

print(solution("aabbaccc"))
print(solution("ababcdcdababcdcd"))
print(solution("abcabcdede"))
print(solution("abcabcabcabcdededededede"))
print(solution("xababcdcdababcdcd"))
 

 

 

교훈

 

1. 가장 최소의 값을 찾을 때 굳이 list에 넣어서 안 찾아도 된다

if answer>len(ss):
        answer=len(ss)

처럼 answer 값이 새로 구한 len(ss) 값보다 크다면 answer를 update하자

 

2. temp 변수 만들기

한 번에 바로 직관적으로 처리하려 하지 말고 (복잡해질 가능성이 크다) temp처럼 변수를 만들어서 차근차근 이용하자,,

변수를 만드면 나중에 값을 변화시킬 수도 있고 더 한 눈에 들어온다

 

3. 극단적인 값 처리

여기서는 1일 때를 처리 못하면 런타임 에러(5번 case)가 떴다

 

# 정답

def solution(s):
    res=list()  # 문자열 길이를 저장할 list

    # 문자열 길이가 1일 때 처리
    if len(s)==1:
        return 1

    for j in range(1, len(s)//2+1): #j는 slice 단위
        cnt=1
        ss=""
        temp=""
        for i in range(0,len(s)+1,j):
            if s[i:i+j]==temp:
                cnt+=1
            else:
                if cnt==1:
                    ss+=temp
                else:
                    ss+=str(cnt)+temp 
                    cnt=1
                temp=s[i:i+j] 

        # 뒤쪽 문자열 처리    
        if cnt==1:
            ss+=temp
        else:
            ss+=str(cnt)+temp
        res.append(len(ss)) 

    # 가장 짧은 것의 길이 return
    return min(res)