티스토리 뷰

반응형

문제

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자

programmers.co.kr

 

풀이

압축후 길이를 체크하는 함수(check)를 만들고, 메인(solution) 함수에서는 문자열의 길이의 반만큼 포문을 돌면서 체크 함수를 호출해 그 중 가장 작은 값을 최종적으로 리턴해줬다.

 

# 메인 함수
def solution(s):

    # 최소값을 일단 압축전 문자열의 길이로 설정
    min = len(s)

    # 1 ~ 압축 전 문자열의 길이의 반까지 포문으로 돌며 check함수 호출, 
    # 압축된 문자열의 길이 리턴받아 최소값 갱신
    for i in range(1, int(len(s) // 2) + 1):
        answer = check(i, s)
        if answer < min:
            min = answer

    return min


# 문자열 압축 후 길이 리턴하는 함수
# length: 잘라서 확인할 단위 길이 / string: 오리지날 문자열
def check(length, string):
    # count: 반복된 횟수 / result: 압축한 문자열
    count = 1
    result = ""

    # 문자열의 0번부터 최종길이-length 전까지
    for i in range(0, len(string) - length, length):

        # 현재 슬라이싱한 문자열과 다음 슬라이싱할 문자열이 같은 경우
        if string[i:i + length] == string[i + length:i + length + length]:
            count += 1

            # 마지막 애인지 확인 (마지막애면 방금까지 처리한 문자열이랑 갯수 붙이기)
            if i + length >= len(string) - length:
                result += str(count) + string[i:i + length]


        else:
            if count != 1:
                result += str(count) + string[i:i + length]
                count = 1

            # 1은 생략
            else:
                result += string[i:i + length]

            # 마지막 애인지 확인 (마지막애면 남은애들 끝에 다 붙여주기)
            if i + length >= len(string) - length:
                result += string[i + length:]

    # 압축한 문자열의 길이 리턴
    return len(result)

 

 

 

새로 알게된 사실

s = "abc"일때 s[2:5]같이 범위에 벗어나게 값을 넣어도 에러가 나지 않는다.

s[-1:3] -> c

s[-1:0] -> 빈값 

 

위의 코드를 짤때 이걸 몰라서 포문으로 범위 처리를 해줬는데 

더 간단하게 짤 수 있었을것같다

반응형