구현
머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정
완전 탐색 - 모든 경우의 수를 주저 없이 다 계산하는 해결 방법
시뮬레이션 - 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행
2020 카카오 신입 공채
프로그래머스
문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다.
압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.
간단한 예로 "aabbaccc"의 경우 "2a2ba3c"와 같이 표현할 수 있다.
aabbaccc
7
ababcdcbababcdcd
9
aabbaccc
1 (=i)
target = a, b, a, c
2a2ba3c (=answer_str)
7 (=res)
2
target = aa, bb, ac, cc
aabbaccc
3
target = aab, bac, cc
aabbaccc
4
aabbaccc
-----------------------------------
ababcdcdababcdcd (16)
1
ababcdcdababcdcd
2
2ab2cd2ab2cd
3
ababcdcdababcdcd
4
ababcdcdababcdcd
5
ababcdcdababcdcd
6
ababcdcdababcdcd
7
ababcdcdababcdcd
8
2ababcdcd
def solution(s):
# 압축한 문자열의 길이가 가장 큰 경우는 문자열이 압축되지 않았을 때
answer = len(s)
# 자를 수 있는 단위는 문자열의 길이의 절반까지 (ex. len(s)=8, 4개 단위까지)
for i in range(1, len(s) // 2 + 1):
target = s[0:i]
compressed = ''
count = 1
# 처음 자른 문자열 이후에 for문으로
for j in range(i, len(s), i):
if target == s[j:j+i]:
count += 1
else:
compressed += str(count) + target if count >= 2 else target
target = s[j:j+i]
count = 1
compressed += str(count) + target if count >= 2 else target
answer = min(answer, len(compressed))
return answer
python 문법이 아직 익숙하지 않아서 구현하기 너무 어려웠던 문제였다. (파이썬 공부하자..)
# 이 문제에서 기억해야 할 부분
# i가 꼭 0부터 시작할 필요 없다!!
for i in range(1, len(s) // 2 + 1):
for j in range(i, len(s), i):
=> for문 range만 잘 알았더라면 풀 수 있었지 않았을까...?
기억하기
range(시작숫자, 종료숫자, step)