728x90
https://programmers.co.kr/learn/courses/30/lessons/60057
- 코드(for문 사용)
def solution(s):
# 최초에 문자열이 분할이 안되면 결국 입력된 문자열의 길이가 최소의 길이가 됨
answer = len(s)
# 문자열을 앞출할때 최소단위는 1에서 문자열길이의 반이다
for step in range(1, len(s) // 2 + 1):
# 예를 들어 aaa 면 3a abcabc면 2abc 지만 abcdabc는 압축할 수 없다.
# 압출 결과
compressed = ''
# 처음 압출할 문자열
prev = s[0:step]
# 반복 갯수
count = 1
# step만큼 압축하기로 했으므로 step만큼 건너뛴다.
for j in range(step, len(s), step):
# 다음 스텝만큼 갔는데 압축할 문자열이랑 같으면
if prev == s[j:j + step]:
# 반복 갯수 추가
count += 1
# 같지 않다면
else:
# 압축한 문자열이 2이상부터 숫자를 메길 수 있음
if count >= 2:
# 압축한 문자열을 카운트한 숫자와 합침
compressed += str(count) + prev
# 갯수가 1이면 생략
else:
compressed += prev
# 이전에 저장된 압축문자열과 다르므로 새로운 압축문자열로 선정
prev = s[j:j + step]
# 다시 1부터 갯수 세기
count = 1
# 맨마지막꺼 고려해주기
if count >= 2:
compressed += str(count) + prev
else:
compressed += prev
# 완성된 압축 문자열과 현재 answer로 정의된 것 길이비교해서 작은걸로 선정
answer = min(answer, len(compressed))
return answer
- 코드(while문 사용)
def solution(s):
# 최초에 문자열이 분할이 안되면 결국 입력된 문자열의 길이가 최소의 길이가 됨
answer = len(s)
# i : 나눌 갯수 1~(문자 길이의 절반)
for i in range(1,len(s)//2+1):
# 미리 i개로 나누어 리스트로 정렬
split_s = []
for j in range(0,len(s),i):
split_s += [s[j:j+i]]
# 압축 결과
result = ''
# 반복 갯수
num = 1
# 비교 인덱스 start : 기준값, end : 비교값
start = 0
end = 1
while start != len(split_s):
# end가 index를 벗어났다는 것은 마지막인덱스까지 비교 끝났다는 뜻
if end == len(split_s):
# 1은 의미 없으니 추가X
if str(num) != '1':
result += str(num)
result += split_s[start]
break
# 비교해서 같지않다면 압축결과에 반복 갯수와 문자추가
if split_s[start] != split_s[end]:
# 단 반복 갯수가 1이면 숫자 추가X
if str(num) != '1':
result += str(num)
result += split_s[start]
# 기본값을 비교값으로 옮기기
# 반복 갯수 1로 초기화
start = end
num = 1
# 비교해서 같다면 반복 갯수 1추가
else:
num += 1
end += 1
# 압축 길이 비교
answer = min(answer,len(result))
return answer
728x90
반응형
'TIL - 프로그래밍 > Python 알고리즘' 카테고리의 다른 글
[프로그래머스] Lv.1 신규 아이디 추천 - Python (0) | 2022.05.27 |
---|---|
[프로그래머스] Lv.1 실패율 - Python (0) | 2022.05.21 |
알고리즘 - 플로이드 (0) | 2022.05.05 |
알고리즘 - 다익스트라 (0) | 2022.05.04 |
[SWEA] 1238. Contact - Python (0) | 2022.04.21 |
댓글