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

 

풀이 설명

1.

i (1부터 n까지)단위마다 각각 반복하면서 문자열을 압축한다 

temp는 길이 i의 문자열이고, temp와 같은 문자의 갯수는 count로 센다. 

count는 1로 초기화한다 (temp가 하나만 있어도 되므로 )

result는 i단위로 압축할 때 만들어지는 전체 문자를 의미한다 

 

2.

i 단위로 진행해야하기 때문에 for j in range(0, n + i, i)로 반복문을 돌린다 (왜 그런지는 '시도해본 풀이'에 적어놨다)

temp와 같은 문자열이라면 count += 1 해준다

 

3. 

temp와 같은 문자열이 아닐때는 2가지가 있다. 

  • 첫번째는 count == 1인 경우인데 이때 1은 생략하므로 result 에 temp만 더해준다 
  • count > 1이라면 반복되는 문자열이 2개이상이므로 숫자 + 문자열을 result에 더해준 뒤 새롭게 반복되는 문자열을 세야하므로 count = 1로 초기화한다 (count == 1일 때는 어차피 count는 1이므로 따로 설정 안 했다)

4.

temp는 i번째만큼 이동한 문자열로 바꾼다(문자열이 반복되는 경우나 같지 않은 경우 모두 똑같다)

 

5. 

i단위로 돌린 최종 결과 result와 answer의 최솟값을 answer에 누적한 후 answer를 반환하면 된다 

 

참고한 블로그

 

- 정답 풀이 : 

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

    for i in range(1, n + 1):
        temp = s[ : i]
        count = 1
        result = ''
        for j in range(i, n + i, i):
            if temp == s[j : j + i] :
                count += 1
            else:
                if count == 1:
                    result += temp
                else: 
                    result += (str(count) + temp)
                    count = 1                
                temp = s[j : j + i]      
        answer = min(answer, len(result))
        
    return answer

 

- 시도해본 풀이 :

for j in range(i, n + 1, i)
-> for j in range(i, n + i, i)

i 단위로 i 부터 n까지만 탐색하면 반복되지 않지만 길이가 정답 길이보다 작은 경우가 발생해서 틀린답을 출력할 수 있다 

그래서 반복되지 않아도 i단위로 문자열 끝까지 진행하게 하기위해 끝점을 n + i로 해야한다 

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

    if n == 1:
        return 1
    for i in range(1, n + 1):
        temp = s[ : i]
        count = 1
        result = ''
        for j in range(i, n + 1, i):
            if temp == s[j : j + i] :
                count += 1
            else:
                if count == 1:
                    result += temp
                else: 
                    result += (str(count) + temp)
                    count = 1
                
            temp = s[j : j + i]
                    
        answer = min(answer, len(result))
        
    return answer

+ Recent posts