어디까지 갈 수 있을까?

[구현] 프로그래머스 문자열 압축 본문

알고리즘/문제

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

_Min 2021. 3. 5. 21:08

문제링크 

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

 

카카오 문제는 예제외에 다른 테스트케이스들도 많이 생각하고 돌려야하는 것 같다

 

 

 

[답코드]

시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def solution(s):
#시뮬레이션 문제?
    answer = len(s)
    
    if len(s)==1:
        return 1
    
#반복 문자열 갯수
    for i in range(1, (len(s) // 2)+1):
        simul_answer=0
#인덱스
        re=0 #반복 횟수
        for j in range(0len(s)-i, i):
            if s[j:j+i]==s[j+i:j+2*i]:
                if re == 0#같으면 #반복이 없었으면
                    simul_answer += len(s[j:j + i]) + 1
                
                re+=1
                if str(re+1).rstrip('0')=='1' and re!=1:
                    simul_answer+=1
                    
            else:
                if re==0:
                    simul_answer += len(s[j:j + i])
                re = 0
        if re==0:
            simul_answer += len(s[j + i:])
 
        if answer>simul_answer:
            answer=simul_answer
    
    return answer
cs

100 점이 나오긴 하는데,

반복이 10, 100, 1000 이상씩 되는 테스트케이스를 생각하지 않고 코딩하다보니

그 처리를 해주기 위해 코드가 길어졌다.

다음에는 테스트케이스 여러개 생각해보고 그에 맞춰 코딩해보자.

 

 

 

다른 분 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def solution(s):
    length = []
    result = ""
    
    if len(s) == 1:
        return 1
    
    for cut in range(1len(s) // 2 + 1): 
        count = 1
        tempStr = s[:cut] 
        for i in range(cut, len(s), cut):
            if s[i:i+cut] == tempStr:
                count += 1
            else:
                if count == 1:
                    count = ""
                result += str(count) + tempStr
                tempStr = s[i:i+cut]
                count = 1
 
        if count == 1:
            count = ""
        result += str(count) + tempStr
        length.append(len(result))
        result = ""
    
    return min(length)
cs

 

 

2달 후 다시 푼 코드

def solution(s):
    answer=0
    n = len(s)
    st=[]
    
    for i in range(1, (n//2)+1): #압축 갯수
        final_s=''
        mid_s=''
        num=1
        for j in range(0, n, i): #시작 인덱스
            if s[j:j+i]==s[j+i:j+2*i]: #압축이 될 때
                if len(mid_s)==0:
                    mid_s=s[j:j+i]
                num+=1
            else:
                if num!=1: #압축 된 값을 문자열에 더할 때
                    final_s+=str(num)+mid_s
                    mid_s=''
                    num=1
                    
                else: #그냥 문자열에 더할 때
                    final_s+=s[j:j+i]
        st.append(final_s)
        
    for s in st:
        if len(s)<n:
            n=len(s)
    
    answer=n
            
    return answer

 

 

[생각]

문자열의 반복이 많아서 예제처럼 결과값을 직접 만드는 방식이 더 좋은 거 같다.

 

 

if 문의 사용을 줄이고,

동일한 수가 반복되면 변수를 사용해서 더 가독성이 좋은 코드를 만들어야겠다.

 

 

테스트케이스

aaaaaaaaaabbbbbbbbbb ->10a10b 이므로 result 6
a -> 1 result 1
aaaaa -> 5a 이므로 result 2
aaaaaaaaaa -> 10a 이므로 result 3 이 나와야 된다

 

 

length가 1일 때 처리, 반복값이 10, 100, 1000 ... 일 때의 처리를 주의하며 코딩해야된다

728x90
Comments