⚡️algorithm

[구현] 이코테, 프로그래머스 문자열 압축

남남이루 2022. 6. 14. 14:14

문제

바로가기
중복되는 문자열을 압축해서 압축 결과가 가장 작은 길이를 출력하라.
조건 1] 앞에서부터 일정 단위로 자른다.
조건 2] 입력되는 문자열의 길이는 1이상 1,000이하이다.

힌트

길이가 1,000이기 때문에 완전 탐색을 수행할 수 있다.
문자열의 길이를 기준으로 가장 큰 반복문의 틀을 만든다.
문자열의 길이는 range(s,e,step)을 이용해, 문자열의 특정 단위를 탐색할 수 있다.

import sys
sys.stdin = open('./구현/input.txt','rt')
s = str(input())
short = len(s)
for step in range(1,len(s)//2+1): # i는 자를 문자열의 길이
                                  # 0 단위, 1단위, 2단위,

    initial = s[:step]
    result = ''
    count = 1
    for j in range(step,len(s),step): # 5 10 15
        if initial == s[j:j+step]:
            count += 1
        else:
            result += str(count) + initial if count>1 else initial
            initial = s[j:j+step]
            count = 1
        print(result)
        short = min(short, len(result))

    result += str(count)+initial if count >1 else initial
    print(result)

리뷰

아예 손도 못대던 문제인데, 이제 기초적인 틀은 스스로 짤 수 있게 됐다는 점이 뿌듯하다.
다만 range로 단위를 건너뛸 수 있다는 데까지 생각이 다다르지 못한 게 아쉽다.
그럼에도 if문과 나머지 변수들을 조작하는 부분이 아직 어려웠기에 이 문제로 구현 연습을 반복적으로 해봐야겠다.

 

+ 22.07.01 추가

다시 푸는 데 전혀 못풀고, 감을 못잡았다. 답을 봐도 도저히 이해가 안됐는데, 알고보니 문제를 잘못 이해한 것이었다.

"어떤 단위로 잘랐을 때 가장 짧게 압축될까??" 가 관건이었는데, 나는 각 문자를 압축하는 조합을 생각하고 있었네.

다시 생각해보니 그냥 후자였어도 답코드랑 안꼬으면 이렇게까지 어렵게 안풀었을 거 같은데..ㅋ ㅋㅎㅎ..

역시 단순히 문제를 많이 푸는 것보다 복습을 주기적으로 해줘야겠다.

문제의 핵심질문을 한 문장으로 줄이는 습관을 들여야겠다. + 테스트 케이스 추가하는 연습도 필요!