https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 요약]
문자열 s를 압축하려고 한다.
동일한 개수로 잘랐을 때 연속으로 동일한 토큰이 존재한다면 압축 가능
가장 짧게 압축했을 때의 길이를 return 하게 하라
[단순 무식한 방법]
1. len(s)/2의 길이까지 직접 토큰을 나눠 봄
2. 각각의 케이스에서 앞 뒤 토큰을 비교
2-1. 만약 똑같다면 해당 토큰을 기억해두고 앞에 붙일 숫자를 늘인다
2-2. 만약 다르고
2-2-1. 앞 토큰이 처음 등장한 친구라면 정답에 해당 토큰을 붙여놓는다
2-2-2. 앞 토큰이 이전에 등장했던 친구라면 정답에 토큰이 등장한 횟수 + 토큰을 붙여놓는다
2-3. 정답의 길이가 그 전 정답의 길이보다 작다면 저장
3. 정답의 길이 리턴
def solution(s):
answer = 9999999
if len(s) ==1:
return 1
for i in range(1,int(len(s)/2)+1): # i개 단위로 잘라 압출
temp = []
fin = ''
for j in range(0,len(s),i): #자르는 과정
try:
temp.append(s[j:j+i])
except:
temp.append(s[j:])
mul = 1
key = ''
temp.append('0')
for k in range(len(temp)-1):
if temp[k] == temp[k+1]:
key = temp[k]
mul+=1
else:
if mul == 1:
fin += temp[k]
else:
fin += str(mul)+key
mul=1
if answer > len(fin):
answer = len(fin)
return answer
코드 다 짜놓고 디버깅 하지말고
차례차례 디버깅하는 습관을 들이자..
시간이 훨 배 더 걸린다
[다른분들 코드]
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)])
zip() 함수 -> iterable 객체를 인자로 받고,
각 객체가 담고 있는 원소를 튜플의 형태로
차례로 접근할 수 있는 반복자를 반환
병렬처리가 가능하다,,
'개발 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Lv.2] - 두 큐 합 같게 만들기 (2022 KAKAO TECH INTERNSHIP) (0) | 2023.04.25 |
---|---|
[프로그래머스 Lv.2] - 튜플 (2019 카카오 개발자 인턴십) (0) | 2023.04.04 |
[프로그래머스 Lv.2] - 오픈채팅방 (2018 KAKAO BLIND RECRUITMENT) (0) | 2023.03.27 |
[프로그래머스 Lv.2] - 파일명 정렬 (2018 KAKAO BLIND RECRUITMENT) (0) | 2023.03.23 |
[프로그래머스 Lv.2] - 뉴스 클러스터링 (2018 KAKAO BLIND RECRUITMENT) (0) | 2023.03.20 |