[프로그래머스 LV.2] 문자열 압축 (Python)

Jaewoong2·2021년 2월 4일
0

알고리즘공부

목록 보기
17/35
post-thumbnail

문제

입출력 예


접근방법

맨처음 글자 부터 맨처음 글자 ~ 글자의 반을 모두 찾으면서, 그 것들을 반복되는 문자열(길이) 로 보고,

그 길이에 맞춰서 문자열을 모두 확인 하며,

동일하면, count증가 시킨다.
만약 동일하지 않고, 전에 동일한 것의 갯수(count)가 1보다 크다면, 현재 자른문자 앞에 count를 추가해서 문자열에 넣어준다. 만약 count가 1번밖에 되지 않았다면, 문자열을 그대로 넣어준다

완전탐색 할때 까지 비교할 배열에 넣어줘서 최소 길이를 반환해주면 된다.

예)
`aaabbbccc` 에서
 1. `a` 로 자르면 1개씩 그 뒤로 문자를 확인한다.
  1.1. `_aabbbccc` 에서 a와 동일한 문자를 확인한다.
  a는 현재 count가 1이다.
  동일한 문자가 있으면, count를 1증가 시킨다.
  맨 처음 a 제외하고, 뒤로 2개가 더있기 때문에
  count는 2증가 된다.
  
  1.2. `___bbbccc` 에서 b는 a와 동일하지 않다.
  동일하지 않은 문자이고, count가 1보다 크기 때문에
  (count가 1이면 1a라고 적지 않기 때문에 2부터)
  ___를 3a 로 변경해준다.
  그리고 이제 b와 동일한게 있는지 검사해야하기 
  때문에, 검사하는 값을 b로 설정한다.
  이후, 1.1과 동일하게 진행이 된다.
  
 2. `aa`로 자르면, 2개씩 그 뒤로 문자를 확인한다.
  2.1. `__abbbccc` 에서 뒤로 2개씩 자를 때, 
  동일한 문자인 `aa` 가 있는지 확인한다.
  하지만, 바로 뒤의 `ab`는 `aa`와 동일하지 않기 
  때문에, 2개로 자를 떄는 신경 안써도 된다. 
 
   
 3. `aaa`로 자르면 2와 동일하게 이루어진다.

코드

  answer = []
  for i in range(1, len(s) // 2 + 1):
      string = ''
      count = 1
      temp = s[0:i]

      for j in range(i, len(s), i):

          if temp == s[j: j + i]:
              count += 1
          else:
              if count > 1:
                  string += str(count)
              string += temp
              temp = s[j: j + i]
              count = 1

      if count > 1:
          string += str(count)
      string += temp
      
      if len(string) not in answer:
          answer.append(len(string))

아쉬운 점

사실, 이 문제는 거의 접근 조차 제대로 하지 못한 문제이다. 그리고 답을 인터넷에서 찾아보고나서 계속해서 연구를 한 뒤 머릿속에 남기기위해 블로그로 작성하였다.

처음에 접근할 때, 맨처음 문자가 안들어 가도 압축을 할 수 있다 라고 접근을 했는데, 마지막 예시로 맨 처음 문자가 무조건 압축이 되어야 한다고 되어 있어서, 멘붕을 했고

이를 토대로 구현을 하는 것이 많이 어려웠다.
나중에 한번 더 풀어봐야겠다....

코테 어려워...

profile
DFF (Development For Fun)

0개의 댓글