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

cheeeese·2022년 12월 11일
0

코딩테스트 연습

목록 보기
148/151
post-thumbnail

📖 문제

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

💻 내 코드

코드1(while문 사용)

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

    for x in range(1,len(s)+1):
        zip_str = s[0:x] # 처음 시작 문자열
        idx = x
        cnt = 1
        new_str = ''
        while idx<=len(s):
            if s[idx:idx+x]==zip_str: # 같으면 압축 가능 -> cnt+1
                cnt+=1
            else: # 다르면 이어 붙임
                if cnt>1: # 압축됐다면
                    new_str+=str(cnt)+zip_str # 숫자와 함께 붙임
                else: # 압축 안되면
                    new_str+=zip_str # 그냥 붙임

                cnt = 1 # cnt 초기화
                zip_str = s[idx:idx+x] # 비교할 문자열 바꿈
            idx+=x
        if idx>len(s): # 인덱스가 넘어가면
            new_str+=s[idx-x:] # 뒷부분은 따로 붙여줌

        answer = min(answer, len(new_str))

    return answer

코드2(for문 사용)

def solution1(s):
    answer = len(s)

    for x in range(1, len(s) + 1):
        zip_str = s[:x]
        cnt = 1
        new_str = ''
        for i in range(x, len(s)+x, x):
            if s[i:i + x] == zip_str:
                cnt += 1
            else:
                if cnt > 1:
                    new_str += str(cnt) + zip_str
                else:
                    new_str += zip_str

                cnt = 1
                zip_str = s[i:i + x]

        answer = min(answer, len(new_str))

    return answer

💡 풀이

  • 문자열을 n개 단위로 자름
  • 현재 잘린 문자열과 계속해서 비교해준다
  • 만약 새로 비교한 문자열이 현재 문자열과 같으면 압축이 가능하다
    • 압축 개수인 cnt를 증가시킴
  • 만약 다르면 압축이 안되기 때문에 현재 비교한 문자열을 새로운 비교 대상으로 지정해줌
    • 이전까지 비교했던 문자열은 새로운 문자열에 붙여준다
    • 만약 cnt가 1보다 크다면 압축이 됐다는 의미이므로 cnt와 함께 이전 비교대상 문자열을 붙여줌
    • cnt가 1이라면 압축이 되지 않았다는 뜻이므로 cnt 없이 문자열만 붙임
  • while문을 사용했을 때엔 마지막에 x만큼 더했을 때 인덱스가 len(s)보다 크면 그 문자열은 확인을 하지 않고 끝나버린다
  • 그래서 마지막은 따로 붙여주었음
  • for문을 사용하면 따로 비교할 필요 없이 for문의 범위를 len(s)+x만큼 해주면 끝까지 확인이 가능함

0개의 댓글