👀 문제
https://programmers.co.kr/learn/courses/30/lessons/60057
👊 도전
1. 설계
- 문자열 자를 사이즈를 구한다.
- 기준 문자열(temp_s)와 현재 문자열(s[i:i+size])가 같으면 cnt++한다.
- 아니라면, result에 저장한다.
- 압축된 문자열 길이와 answer 중 min 값을 answer에 저장한다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solution(s):
answer = 1000
if len(s)==1: return 1
for size in range(1, len(s)//2+1): # 압축 길이
temp_s=s[:size]
cnt=1
result=""
for i in range(size, len(s), size):
if s[i:i+size]==temp_s:
cnt+=1
else:
if cnt>1: result+=str(cnt)
result+=temp_s
temp_s=s[i:i+size]
cnt=1
if cnt>1: result+=str(cnt)
result+=temp_s
answer=min(answer, len(result))
return answer
3. 결과
🤟 성공 🤟
4. 설명
- 압축 길이를 구한다
- for문을 1~len(s)//2+1까지 체크하면 된다.
- 압축 길이가 s의 반 이상을 넘어가면 뒤에 문자열로는 압축시킬 수 없으므로 len(s)/2 이상은 체크하지 않아도 된다.
- 조건에 맞게 문자열을 압축한다
- 문자열이 같으면 cnt++한다.
- 다르다면, result에 현재 문자열을 넣는다. cnt는 cnt>1만 result에 넣는다.
- 이제 다음 체크할 문자열을 temp_s에 넣는다. 현재 s[i]가 다른 문자이므로 i를 포함하고 size만큼 길이를 가진다.
- cnt도 초기화.
- 마지막 i가 temp_s와 같으면 result에 추가되지않고 for문을 종료하게 된다. 이 값을 넣어줘야 하므로 for문 밖에서 result에 다시 추가해준다.