(파이썬으로 코딩테스트 연습) Programmers > 2020 KAKAO BLIND RECRUITMENT > 문자열 압축
https://programmers.co.kr/learn/courses/30/lessons/60057
Solution
def solution(s):
if len(s)==1 :
return(1)
answer = []
for i in range(1,int(len(s)/2)+1) :
split_data = [s[z:z+i] for z in range(0, len(s), i)] # 주어진 개수만큼 자르기
cnt=1
result=[]
result.append(split_data.pop(0))
while len(split_data)>0 :
temp = split_data.pop(0)
if result[-1]==temp :
cnt+=1
else :
if cnt!=1 :
result.append(str(cnt))
cnt=1
result.append(temp)
if cnt!=1 :
result.append(str(cnt))
answer.append(len("".join(result)))
return min(answer)
문자열을 1개, 2개, 3개, ..., 개수만큼 잘라서 결과값을 비교했다.
문자열개수만큼 다 확인할 필요는 없고 (문자열개수/2)+1개 까지만 비교하면된다.
(전체길이/2) 한 것 보다 많은 개수가 반복될 수는 없기 때문이다.
주어진 문자열의 길이가 1개일때는 바로 1을 return해준다.
아래 for문의 범위가 range(1, int(len(s)/2)+1)이기때문에 len(s)가 1일때는 for문 안에 내용을 실행하지 못한다. 그럼 answer이 빈 리스트이므로 마지막 min(answer)에서 런타임 에러가 발생한다.
split_data = [s[z:z+i] for z in range(0, len(s), i)]은 문자열을 i만큼 잘라서 결과를 리스트로 저장한다.
result는 각 문자가 몇 번 반복됐는지 저장하고 answer는 최종적으로 압축된 글자수를 저장한다.
다음은 s가 "abcabcabcabcdededededede" 일때 i에 따른 result와 len("".join(result))에 대한 결과이다.
i=6일 때 abcabc가 두 번 반복되고, dedede가 2번 반복된다.
단, 1번만 반복되었을 때는 1이라는 값은 저장하지 않는다.
이 result의 결과를 합쳐서 글자수를 세어주어 answer이라는 리스트에 모두 저장하고, 그 중 가장 작은 값을 return한다.
다른 사람의 풀이
전반적인 로직은 비슷하나, 코드가 좀 더 깔끔하다.
text와 몇 개 단위로 자를지를 입력으로 받아 결과를 return하는 함수를 compress라는 이름으로 따로 짜고,
solution에서 for문을 통해 결과를 return했다.
결과는 따로 list에 담지않고, min()으로 바로 return한다.
입력받은 text 길이가 1개일 경우를 대비하여 마지막에 [len(text)]를 추가했다.
이를 해주지 않으면 for문 range 중 int(len(text/2))+1이 1이므로 for문을 통화하지 못하고 compress()함수를 실행하지 못한다.
따라서 빈값이 return된다.
compress 함수를 자세히 살펴보면
text="abcabcabcabcdededededede", tok_len=2라 할 때
words는 다음과 같고,
for문에 a와 b가 될 iter는 다음과 같다.
for문에 a,b에 따른 cur_word와 cur_cnt는 다음과 같다.
최종 res와 result(압축된 길이)도 위 이미지에 있다.
즉, 현재값과 다음값이 같으면 cnt는 +1되고, 다르면 현재값과 cnt를 res에 저장한다.
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[Python - 프로그래머스] 2023 KAKAO BLIND RECRUITMENT > 택배 배달과 수거하기 (2) | 2023.01.16 |
---|---|
[Python - 프로그래머스] 2023 KAKAO BLIND RECRUITMENT > 개인정보 수집 유효기간 (0) | 2023.01.12 |
[Python - 프로그래머스] 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천 (0) | 2022.03.17 |
[Python - 프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2022.03.16 |
[Python - 프로그래머스] 2022 KAKAO BLIND RECRUITMENT > 신고 결과 받기 (0) | 2022.03.16 |