본문 바로가기

알고리즘

[programmers] 문자열 압축

문제설명

제한사항

 

입출력 예

 

 

 


로직설명

1. 앞 문자열이랑 같은 길이의 문자열이 같은지 확인

2. 단위로 자를 때마다 새로운 word문자열에 넣어서 값 비교하기
3. 각 알파벳마다 하나씩 늘려갈 때 cnt += 1해주고(word에 추가되었다면 cnt=1로 초기화)

4. cnt = 1이면 문자만 넣고, cnt != 1이면 숫자를 문자화하고 숫자랑, 문자 둘다 넣어주기
5. 앞 문자열을 다음 문자열로 바꿔줘서 계속 진행하면서 확인할 수 있도록!

 

코드

def solution(s):

    if len(s) == 1:
        return 1

    answer = 9999999999999999999999999999999
    for i in range(1, len(s) // 2 + 1):
        cnt = 1
        word = ''
        front = s[:i]  # 문자열은 제일 앞부터 정해진 길이만큼 잘라야 한다!
        for j in range(i, len(s) + i, i):
            back = s[j:j + i]
            if front == back:
                cnt += 1
            else:
                if cnt == 1:
                    word += front
                else:
                    word += str(cnt)
                    word += front
                    cnt = 1

            front = s[j:j + i]
        temp = len(word)
        if answer > temp:
            answer = temp

    return answer

 

주의해야하는 부분

1. s[j:j+1] -> s[j:j+i] : 이렇게 되어야 j i만큼 띄어서 진행하는데, 다음 j전까지 값을 가질 수 있다.
                          : 문자열이 1개 단위로 잘릴 때는 상관없지만, 2개 이상이면 나오지 않음


2. for i in range(1, len(s) // 2 + 1) : 굳이 len(s)까지 할 필요가 없다.

       ex. abcabc -> front='abc'이면 뒷부분은 abc가 될 것!


3. for j in range(i, len(s) + i, i) : len(s) + i 하는 이유

 

'알고리즘' 카테고리의 다른 글

[baekjoon] 7576. 토마토  (0) 2020.06.29
[programmers] 크레인 인형뽑기 게임  (0) 2020.06.27
[baekjoon] 2468. 안전 영역  (0) 2020.06.25
[baekjoon] 2667. 단지 내 수 세기  (0) 2020.06.25
[programmers] 괄호 변환  (0) 2020.06.25