https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 접근
이전에 답을 보고 작성했지만 직접 손으로 써보지 않아 애매하게 이해하고 끝낸 문항.. 이번엔 제대로 끝내자!!
문제..!!
1. 사실 문자열을 자르는 범위가 1부터 시작인 건 쉽게 알 수 있지만 최대를 구하는 것이 문제였다.
2. aaabbb를 생각하면 1개 단위로 자르면 3a3b(=4), 3개 단위로 자르면 aaabbb(=6)이므로 큰 단위로 압축한다고 해서 더 짧은 문자열은 아니다... 다 구해봐야 하는 듯
이 문제에서 코드 작성에 있어서 핵심은
1. 첫 번째 껍데기의 반복문을 압축 단위를 늘려가는 걸 기준으로 하는 것 그리고 그 범위를 지정하는 것
2. 내부의 반복문에서 만약 이전 문자와 다른 문자가 튀어나오는 경우 새로운 하나의 문자로 재설정하고 카운트 횟수를 리셋하는 것
시간 복잡도의 경우 문자열의 길이가 1000 이하로 정해 있으므로 O(N^2)까지 가능하다.
코드
def solution(s):
answer = len(s)
for step in range(1, len(s)//2+1): # 압축 단위는 1 ~ n/2까지 가능, 압축 단위를 기준으로 반복문(핵심1)
compressed = "" # 문자열을 계속 저장해나갈 변수
prev = s[0:step] # 비교할 문자 저장
cnt = 1 # 압축 횟수를 세기 위한 변수
for j in range(step, len(s), step): # step(단위)만큼 증가시키며 이전 문자열과 비교
if prev == s[j:j + step]:
cnt += 1
else:
if cnt >= 2:
compressed += str(cnt) + prev # 반복 횟수(cnt)와 문자열(prev)을 합쳐서 압축된 문자열 추가
else:
compressed += prev # 반복 횟수가 1인 경우, 원래 문자열(prev)을 그대로 추가
prev = s[j:j + step] # 새로운 하나의 문자로 재설정(핵심2)
cnt = 1 # 카운트 횟수 리셋
compressed += str(cnt) + prev if cnt >= 2 else prev
answer = min(answer, len(compressed)) # 이전 압축 문자열의 길이와 비교해서 더 작은 값으로 갱신
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]Lv2. 행렬 테두리 회전하기(Python) (0) | 2024.02.19 |
---|---|
[프로그래머스]Lv1. 바탕화면 정리(Python) (0) | 2024.02.19 |
[프로그래머스]Lv3. 표현 가능한 이진트리(Python) (1) | 2024.02.13 |
[프로그래머스]Lv2. 혼자 하는 틱택토(Python) (0) | 2024.02.12 |
[프로그래머스]Lv1. 가장 많이 받은 선물(Python) (0) | 2024.02.11 |