def solution(s):
answer = 0
n = len(s)
result = n
for i in range(1, int(n/2)+1) :
r = 0
l = i
before = s[r:i]
count = 1
temp = []
while r < n :
r += l
i += l
if s[r:i] == before :
count += 1
before = s[r:i]
else :
if count > 1 :
temp.append(str(count)+ before)
count = 1
else :
temp.append(before)
before = s[r:i]
answer = len(''.join(temp))
if result > answer :
result = answer
return result
풀이
1) for문 및 초기 변수 설정
answer = 0 # 정답이 들어갈 변수
n = len(s) # s의 길이
result = n # 결괏값
for i in range(1, int(n/2)+1) :
r = 0 # 오른쪽 포인트 설정
l = i # 문자 길이 설정
before = s[r:i] # 현재 문자의 전 문자
count = 1 # 얼마나 같은 문자 배열이 반복되는지 기록
temp = [] # 임시 리스트
answer, n, result 각 변수에 값을 넣어준다.
for문은 1부터 n길이의 반까지만 돌게 한다.
2) for > while > if
while r < n :
r += l
i += l
if s[r:i] == before :
count += 1
before = s[r:i]
① 오른쪽으로 움직이는 포인트(r)가 n까지 돌도록 while문 설정
② while 문을 돌 때마다 r과 i에 l을 더하면서 포인트의 위치를 움직인다.
③ 만약 현재 문자(s[r:i])가 이전 문자와 같다면 count에 1을 더해주고 이전 문자를 업데이트해준다.
3) for > while > else
else :
if count > 1 :
temp.append(str(count)+ before)
count = 1
else :
temp.append(before)
before = s[r:i]
① 만약 현재 문자가 이전 문자와 같지 않다면 (이전 문자 추가하기)
if ) count > 1이라면 (이전 문자로 압축한 적이 있다면) count(이전 문자 압축 횟수?)와 before(이전 문자)를 temp에 추가한다.
그리고 count는 1로 초기화한다.
else) count = 1이라면 (이전 문자가 반복 X) temp에 이전 문자를 추가해준다.
② before을 현재 문자로 업데이트해준다.
4) for > while 문이 다 돌았을 경우(압축 끝난 경우)
answer = len(''.join(temp))
if result > answer :
result = answer
return result
① answer에 l(또는 i)개 단위로 압축한 문자열의 길이를 받아준다.
② 만약 answer(l개 단위로 압축한 결과)이 result(그 전 단위(l-1)로 압축 결과) 보다 작다면 result를 answer의 값으로 업데이트시켜준다.
③ 그렇게 된다면 가장 짧은 문자열이 정답이 된다.
'Algorithm > Programmers' 카테고리의 다른 글
[Python] 음양 더하기 (0) | 2021.05.20 |
---|---|
[Python] 폰켓몬 (0) | 2021.05.20 |
[Python] 내적 (0) | 2021.05.18 |
[Python] 이상한 문자 만들기 (0) | 2021.05.18 |
[Python] 약수의 갯수와 덧셈 (0) | 2021.05.18 |