[이것이 코딩 테스트다] 구현 - 문자열 압축

YEAh·2021년 3월 9일
0
post-thumbnail

구현
머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정
완전 탐색 - 모든 경우의 수를 주저 없이 다 계산하는 해결 방법
시뮬레이션 - 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행

2020 카카오 신입 공채
프로그래머스


✅ 문제

문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다.
압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.
간단한 예로 "aabbaccc"의 경우 "2a2ba3c"와 같이 표현할 수 있다.

입력 예시 1

aabbaccc

출력 예시 1

7

입력 예시 2

ababcdcbababcdcd

출력 예시 2

9

내가 해본 시뮬레이션

aabbaccc

1 (=i)
target = a, b, a, c 
2a2ba3c (=answer_str)
7 (=res) 

2
target = aa, bb, ac, cc
aabbaccc 

3
target = aab, bac, cc
aabbaccc

4
aabbaccc
-----------------------------------

ababcdcdababcdcd (16)

1
ababcdcdababcdcd

2
2ab2cd2ab2cd

3
ababcdcdababcdcd

4
ababcdcdababcdcd

5
ababcdcdababcdcd

6
ababcdcdababcdcd

7
ababcdcdababcdcd

8
2ababcdcd

➕ 문제 해설

def solution(s):
    # 압축한 문자열의 길이가 가장 큰 경우는 문자열이 압축되지 않았을 때
    answer = len(s)

    # 자를 수 있는 단위는 문자열의 길이의 절반까지 (ex. len(s)=8, 4개 단위까지)
    for i in range(1, len(s) // 2 + 1):
        target = s[0:i]
        compressed = ''
        count = 1
        # 처음 자른 문자열 이후에 for문으로 
        for j in range(i, len(s), i):
            if target == s[j:j+i]:
                count += 1
            else:
                compressed += str(count) + target if count >= 2 else target
                target = s[j:j+i]
                count = 1
        compressed += str(count) + target if count >= 2 else target
        answer = min(answer, len(compressed))
    return answer

📝 정리

python 문법이 아직 익숙하지 않아서 구현하기 너무 어려웠던 문제였다. (파이썬 공부하자..)

# 이 문제에서 기억해야 할 부분
# i가 꼭 0부터 시작할 필요 없다!!
for i in range(1, len(s) // 2 + 1):
        for j in range(i, len(s), i):

=> for문 range만 잘 알았더라면 풀 수 있었지 않았을까...?

기억하기
range(시작숫자, 종료숫자, step)

profile
End up being.

0개의 댓글