- 문제 : 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
'코딩테스트 > 기출' 카테고리의 다른 글
[ / 프로그래머스] 12981번 : 영어 끝말잇기 (0) | 2022.09.09 |
---|---|
[월간 코드 챌린지 시즌1 / 프로그래머스] 70129번: 이진 변환 반복하기 (0) | 2022.09.08 |
[Summer Winter Coding(2019) / 프로그래머스] 멀쩡한 사각형 (0) | 2022.09.06 |
[2019 KAKAO BLIND RECRUITMENT / 프로그래머스] 42888번 : 오픈 채팅방 (0) | 2022.09.06 |
[2022 kakao tech intership / 프로그래머스] 118667번 : 두 큐 합 같게 만들기 (0) | 2022.09.06 |