알고리즘/문제
[구현] 프로그래머스 문자열 압축
_Min
2021. 3. 5. 21:08
문제링크
programmers.co.kr/learn/courses/30/lessons/60057
카카오 문제는 예제외에 다른 테스트케이스들도 많이 생각하고 돌려야하는 것 같다
[답코드]
시도
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
def solution(s):
#시뮬레이션 문제?
answer = len(s)
if len(s)==1:
return 1
#반복 문자열 갯수
for i in range(1, (len(s) // 2)+1):
simul_answer=0
#인덱스
re=0 #반복 횟수
for j in range(0, len(s)-i, i):
if s[j:j+i]==s[j+i:j+2*i]:
if re == 0: #같으면 #반복이 없었으면
simul_answer += len(s[j:j + i]) + 1
re+=1
if str(re+1).rstrip('0')=='1' and re!=1:
simul_answer+=1
else:
if re==0:
simul_answer += len(s[j:j + i])
re = 0
if re==0:
simul_answer += len(s[j + i:])
if answer>simul_answer:
answer=simul_answer
return answer
|
cs |
100 점이 나오긴 하는데,
반복이 10, 100, 1000 이상씩 되는 테스트케이스를 생각하지 않고 코딩하다보니
그 처리를 해주기 위해 코드가 길어졌다.
다음에는 테스트케이스 여러개 생각해보고 그에 맞춰 코딩해보자.
다른 분 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
def solution(s):
length = []
result = ""
if len(s) == 1:
return 1
for cut in range(1, len(s) // 2 + 1):
count = 1
tempStr = s[:cut]
for i in range(cut, len(s), cut):
if s[i:i+cut] == tempStr:
count += 1
else:
if count == 1:
count = ""
result += str(count) + tempStr
tempStr = s[i:i+cut]
count = 1
if count == 1:
count = ""
result += str(count) + tempStr
length.append(len(result))
result = ""
return min(length)
|
cs |
2달 후 다시 푼 코드
def solution(s):
answer=0
n = len(s)
st=[]
for i in range(1, (n//2)+1): #압축 갯수
final_s=''
mid_s=''
num=1
for j in range(0, n, i): #시작 인덱스
if s[j:j+i]==s[j+i:j+2*i]: #압축이 될 때
if len(mid_s)==0:
mid_s=s[j:j+i]
num+=1
else:
if num!=1: #압축 된 값을 문자열에 더할 때
final_s+=str(num)+mid_s
mid_s=''
num=1
else: #그냥 문자열에 더할 때
final_s+=s[j:j+i]
st.append(final_s)
for s in st:
if len(s)<n:
n=len(s)
answer=n
return answer
[생각]
문자열의 반복이 많아서 예제처럼 결과값을 직접 만드는 방식이 더 좋은 거 같다.
if 문의 사용을 줄이고,
동일한 수가 반복되면 변수를 사용해서 더 가독성이 좋은 코드를 만들어야겠다.
테스트케이스
aaaaaaaaaabbbbbbbbbb ->10a10b 이므로 result 6
a -> 1 result 1
aaaaa -> 5a 이므로 result 2
aaaaaaaaaa -> 10a 이므로 result 3 이 나와야 된다
length가 1일 때 처리, 반복값이 10, 100, 1000 ... 일 때의 처리를 주의하며 코딩해야된다
728x90