코딩테스트/기출
[2020 KAKAO BLIND RECRUITMENT / 프로그래머스] 60057번 : 문자열 압축
ydin
2022. 9. 7. 17:04
- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/60057
풀이 설명
1.
i (1부터 n까지)단위마다 각각 반복하면서 문자열을 압축한다
temp는 길이 i의 문자열이고, temp와 같은 문자의 갯수는 count로 센다.
count는 1로 초기화한다 (temp가 하나만 있어도 되므로 )
result는 i단위로 압축할 때 만들어지는 전체 문자를 의미한다
2.
i 단위로 진행해야하기 때문에 for j in range(0, n + i, i)로 반복문을 돌린다 (왜 그런지는 '시도해본 풀이'에 적어놨다)
temp와 같은 문자열이라면 count += 1 해준다
3.
temp와 같은 문자열이 아닐때는 2가지가 있다.
- 첫번째는 count == 1인 경우인데 이때 1은 생략하므로 result 에 temp만 더해준다
- count > 1이라면 반복되는 문자열이 2개이상이므로 숫자 + 문자열을 result에 더해준 뒤 새롭게 반복되는 문자열을 세야하므로 count = 1로 초기화한다 (count == 1일 때는 어차피 count는 1이므로 따로 설정 안 했다)
4.
temp는 i번째만큼 이동한 문자열로 바꾼다(문자열이 반복되는 경우나 같지 않은 경우 모두 똑같다)
5.
i단위로 돌린 최종 결과 result와 answer의 최솟값을 answer에 누적한 후 answer를 반환하면 된다
- 정답 풀이 :
def solution(s):
n = len(s)
answer = 1001
for i in range(1, n + 1):
temp = s[ : i]
count = 1
result = ''
for j in range(i, n + i, i):
if temp == s[j : j + i] :
count += 1
else:
if count == 1:
result += temp
else:
result += (str(count) + temp)
count = 1
temp = s[j : j + i]
answer = min(answer, len(result))
return answer
- 시도해본 풀이 :
for j in range(i, n + 1, i)
-> for j in range(i, n + i, i)
i 단위로 i 부터 n까지만 탐색하면 반복되지 않지만 길이가 정답 길이보다 작은 경우가 발생해서 틀린답을 출력할 수 있다
그래서 반복되지 않아도 i단위로 문자열 끝까지 진행하게 하기위해 끝점을 n + i로 해야한다
def solution(s):
n = len(s)
answer = 1001
if n == 1:
return 1
for i in range(1, n + 1):
temp = s[ : i]
count = 1
result = ''
for j in range(i, n + 1, i):
if temp == s[j : j + i] :
count += 1
else:
if count == 1:
result += temp
else:
result += (str(count) + temp)
count = 1
temp = s[j : j + i]
answer = min(answer, len(result))
return answer