티스토리 뷰
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
|
def solution(s):
num=len(s) ## 값의 초기화는 최초 문자열의 길이
for i in range(1,(len(s)//2)+1):
lst=[]
start=0
while start<=len(s)-1: ## 문자열을 단위별로 분리
lst.append(s[start:start+i])
start+=i
start=0
ans=''
while start<len(lst): ## 압축과정
count=1
for nextNum in range(start+1,len(lst)+1):
if nextNum!=len(lst) and lst[start]==lst[nextNum]: ## 문자가 같으면 갯수 증가
count+=1
else:
if count!=1: ## 갯수가 1초과 일때에만 숫자표시
ch=str(count)+lst[start]
ans+=ch
count=1
start+=1
else:
ans+=lst[start]
start+=1
break
start+=1
num=min(num,len(ans))
return num
|
cs |
본 문제는 문자열을 압축에 관한 문제를 다루고 있다.
나의 경우 해결하는 원리는 리턴할 변수를 주어진 문자열 길이로 한다. 그 이유는 문자열이 1일 수도 있기 때문에 제대로 초기화를 해주지 않으면 잘못된 값을 가져와서 틀렸다고 출력하기 때문이다.
그리고 문자열을 쪼개는 범위를 절반까지로 했는데 그 이유는 압축했을 때 최대 가능한 것이 절반이기 때문이다.
압축과정을 설명하자면 for문에서 len(lst)+1을 해준 이유는 마지막 문자까지 봐야하기 때문이다. 하지만 저렇게 할 경우
lst[start]==lst[nextNum]이 부분에서 에러가 뜨기 때문에 nextNum!=len(lst)로 그 에러를 피해나가면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
def compress(text, tok_len):
words = [text[i:i+tok_len] for i in range(0, len(text), tok_len)]
res = []
cur_word = words[0]
cur_cnt = 1
for a, b in zip(words, words[1:] + ['']):
if a == b:
cur_cnt += 1
else:
res.append([cur_word, cur_cnt])
cur_word = b
cur_cnt = 1
return sum(len(word) + (len(str(cnt)) if cnt > 1 else 0) for word, cnt in res)
def solution(text):
return min(compress(text, tok_len) for tok_len in list(range(1, int(len(text)/2) + 1)) + [len(text)])
|
cs |
다른 사람의 풀이이다. 프로그래머스 다른사람의 풀이에 가장 처음에 등장하는 코드이기도 하다.
compress라는 함수를 통해 각 각 몇 개 단위로 줄이냐의 경우를 해결하고 for문을 통해 해당되는 숫자를 기입한다.
compress에서는 우선 문자열을 일정 단위로 단어를 쪼갠다. 그러고 나서 상태를 집어넣을 리스트와 글자 그리고 숫자를 초기화 한다. 그러고 나서 for문을 돌리는데 이때 zip을 통하여 현재 단어와 다음 단어를 표현하였다. 이때 다음 단어를 표현 하는 리스트는 한 개가 부족하므로 ['']를 추가한 형태로 돌린다.
안의 내용은 위와 같다.
다만 이 분은 문자열로 저장하지 않고 리스트로 표현함으로써 return 할 때에도 숫자와 단어를 각각 읽어서 숫자는 1초과일때만 읽고 문자열은 len()을 통하여 길이를 반환하여 표현하였다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
2017카카오코드 예선 카카오프렌즈 컬러링북 파이썬 (0) | 2021.02.03 |
---|---|
2021 KAKAO BLIND RECRUITMENT 메뉴 리뉴얼 (0) | 2021.02.01 |
2021 KAKAO BLIND RECRUITMENT순위 검색 (0) | 2021.01.28 |
실패율 (0) | 2021.01.27 |
비밀지도 (0) | 2021.01.27 |
- Total
- Today
- Yesterday
- 알고리즘
- docker-compose
- dockerignore
- Collections
- 파이썬
- env
- Celery
- 카카오
- Java
- 그래프
- postgres
- Linux
- docker
- 백준
- PostgreSQL
- ubuntu
- 프로그래머스
- django
- setattr
- 2021 KAKAO BLIND RECRUITMENT
- 자바
- Command Line
- Python
- BFS
- Spring
- thread
- headers
- DRF
- 면접
- Pattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |